[{"data":1,"prerenderedAt":972},["ShallowReactive",2],{"navigation_docs":3,"-guides-errors":195,"-guides-errors-surround":967},[4,23,65,87,133,155,173],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":22},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":19,"path":20,"stem":21},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Guides","i-lucide-compass","\u002Fguides","2.guides",[29,33,37,41,45,49,53,57,61],{"title":30,"path":31,"stem":32},"Authenticate","\u002Fguides\u002Fauthentication","2.guides\u002F1.authentication",{"title":34,"path":35,"stem":36},"Work with several forges","\u002Fguides\u002Fmultiple-forges","2.guides\u002F2.multiple-forges",{"title":38,"path":39,"stem":40},"Configure from the environment","\u002Fguides\u002Fenvironment","2.guides\u002F3.environment",{"title":42,"path":43,"stem":44},"Receive webhooks","\u002Fguides\u002Fwebhooks","2.guides\u002F4.webhooks",{"title":46,"path":47,"stem":48},"Check what a forge supports","\u002Fguides\u002Fcapabilities","2.guides\u002F5.capabilities",{"title":50,"path":51,"stem":52},"Handle errors and rate limits","\u002Fguides\u002Ferrors","2.guides\u002F6.errors",{"title":54,"path":55,"stem":56},"Page through results","\u002Fguides\u002Fpagination","2.guides\u002F7.pagination",{"title":58,"path":59,"stem":60},"Browser bundles","\u002Fguides\u002Fbundling","2.guides\u002F8.bundling",{"title":62,"path":63,"stem":64},"Test your code","\u002Fguides\u002Ftesting","2.guides\u002F9.testing",{"title":66,"icon":67,"path":68,"stem":69,"children":70,"page":22},"Concepts","i-lucide-lightbulb","\u002Fconcepts","3.concepts",[71,75,79,83],{"title":72,"path":73,"stem":74},"Data model","\u002Fconcepts\u002Fdata-model","3.concepts\u002F1.data-model",{"title":76,"path":77,"stem":78},"Capabilities","\u002Fconcepts\u002Fcapabilities","3.concepts\u002F2.capabilities",{"title":80,"path":81,"stem":82},"Providers and factories","\u002Fconcepts\u002Fproviders","3.concepts\u002F3.providers",{"title":84,"path":85,"stem":86},"Events","\u002Fconcepts\u002Fevents","3.concepts\u002F4.events",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Providers","i-lucide-server","\u002Fproviders","4.providers",[93,97,101,105,109,113,117,121,125,129],{"title":94,"path":95,"stem":96},"Azure DevOps","\u002Fproviders\u002Fazure-devops","4.providers\u002Fazure-devops",{"title":98,"path":99,"stem":100},"Bitbucket Cloud","\u002Fproviders\u002Fbitbucket","4.providers\u002Fbitbucket",{"title":102,"path":103,"stem":104},"Cursor Origin","\u002Fproviders\u002Fcursor-origin","4.providers\u002Fcursor-origin",{"title":106,"path":107,"stem":108},"Forgejo and Codeberg","\u002Fproviders\u002Fforgejo","4.providers\u002Fforgejo",{"title":110,"path":111,"stem":112},"Gitea","\u002Fproviders\u002Fgitea","4.providers\u002Fgitea",{"title":114,"path":115,"stem":116},"Gitee","\u002Fproviders\u002Fgitee","4.providers\u002Fgitee",{"title":118,"path":119,"stem":120},"GitHub","\u002Fproviders\u002Fgithub","4.providers\u002Fgithub",{"title":122,"path":123,"stem":124},"GitLab","\u002Fproviders\u002Fgitlab","4.providers\u002Fgitlab",{"title":126,"path":127,"stem":128},"pushin.eu","\u002Fproviders\u002Fpushin","4.providers\u002Fpushin",{"title":130,"path":131,"stem":132},"Tangled","\u002Fproviders\u002Ftangled","4.providers\u002Ftangled",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":22},"Reference","i-lucide-book-marked","\u002Freference","5.reference",[139,143,147,151],{"title":140,"path":141,"stem":142},"Provider API","\u002Freference\u002Fprovider-api","5.reference\u002F1.provider-api",{"title":144,"path":145,"stem":146},"Capability matrix","\u002Freference\u002Fcapability-matrix","5.reference\u002F2.capability-matrix",{"title":148,"path":149,"stem":150},"Errors","\u002Freference\u002Ferrors","5.reference\u002F3.errors",{"title":152,"path":153,"stem":154},"JSON Schemas","\u002Freference\u002Fjson-schemas","5.reference\u002F5.json-schemas",{"title":156,"icon":157,"path":158,"stem":159,"children":160,"page":22},"Examples","i-lucide-boxes","\u002Fexamples","6.examples",[161,165,169],{"title":162,"path":163,"stem":164},"Inbox CLI","\u002Fexamples\u002Finbox-cli","6.examples\u002F1.inbox-cli",{"title":166,"path":167,"stem":168},"Label bot","\u002Fexamples\u002Flabel-bot","6.examples\u002F2.label-bot",{"title":170,"path":171,"stem":172},"Release digest","\u002Fexamples\u002Frelease-digest","6.examples\u002F3.release-digest",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":22},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","7.contributing",[179,183,187,191],{"title":180,"path":181,"stem":182},"Contribution guide","\u002Fcontributing\u002Fguidelines","7.contributing\u002F1.guidelines",{"title":184,"path":185,"stem":186},"Write a provider","\u002Fcontributing\u002Fwrite-a-provider","7.contributing\u002F2.write-a-provider",{"title":188,"path":189,"stem":190},"Record fixtures","\u002Fcontributing\u002Frecord-fixtures","7.contributing\u002F3.record-fixtures",{"title":192,"path":193,"stem":194},"Contributors","\u002Fcontributing\u002Fcontributors","7.contributing\u002F4.contributors",{"id":196,"title":50,"body":197,"description":960,"extension":961,"links":962,"meta":963,"navigation":271,"path":51,"seo":965,"stem":52,"__hash__":966},"docs\u002F2.guides\u002F6.errors.md",{"type":198,"value":199,"toc":954},"minimark",[200,213,535,568,573,594,717,735,742,746,758,762,775,781,932,936,950],[201,202,203,204,208,209,212],"p",{},"Failed requests reject with a typed error. All of them extend ",[205,206,207],"code",{},"ForgeError",", so you can catch the base class and narrow with ",[205,210,211],{},"instanceof",":",[214,215,220],"pre",{"className":216,"code":217,"language":218,"meta":219,"style":219},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { ForgeError, RateLimitedError, TokenRevokedError } from 'forges'\n\ntry {\n  await gh.threads.close(thread.ref)\n}\ncatch (error) {\n  if (error instanceof RateLimitedError) {\n    console.warn(`Rate limited until ${error.resetAt?.toISOString()}`)\n  }\n  else if (error instanceof TokenRevokedError) {\n    await askForNewToken()\n  }\n  else if (error instanceof ForgeError) {\n    console.error(error.forge, error.url, error.message)\n  }\n  else {\n    throw error\n  }\n}\n","ts","",[205,221,222,266,273,282,318,324,336,359,402,408,429,441,446,465,504,509,516,525,530],{"__ignoreMap":219},[223,224,227,231,235,239,242,245,247,250,253,256,259,263],"span",{"class":225,"line":226},"line",1,[223,228,230],{"class":229},"s7zQu","import",[223,232,234],{"class":233},"sMK4o"," {",[223,236,238],{"class":237},"sTEyZ"," ForgeError",[223,240,241],{"class":233},",",[223,243,244],{"class":237}," RateLimitedError",[223,246,241],{"class":233},[223,248,249],{"class":237}," TokenRevokedError",[223,251,252],{"class":233}," }",[223,254,255],{"class":229}," from",[223,257,258],{"class":233}," '",[223,260,262],{"class":261},"sfazB","forges",[223,264,265],{"class":233},"'\n",[223,267,269],{"class":225,"line":268},2,[223,270,272],{"emptyLinePlaceholder":271},true,"\n",[223,274,276,279],{"class":225,"line":275},3,[223,277,278],{"class":229},"try",[223,280,281],{"class":233}," {\n",[223,283,285,288,291,294,297,299,303,307,310,312,315],{"class":225,"line":284},4,[223,286,287],{"class":229},"  await",[223,289,290],{"class":237}," gh",[223,292,293],{"class":233},".",[223,295,296],{"class":237},"threads",[223,298,293],{"class":233},[223,300,302],{"class":301},"s2Zo4","close",[223,304,306],{"class":305},"swJcz","(",[223,308,309],{"class":237},"thread",[223,311,293],{"class":233},[223,313,314],{"class":237},"ref",[223,316,317],{"class":305},")\n",[223,319,321],{"class":225,"line":320},5,[223,322,323],{"class":233},"}\n",[223,325,327,330,333],{"class":225,"line":326},6,[223,328,329],{"class":229},"catch",[223,331,332],{"class":237}," (error) ",[223,334,335],{"class":233},"{\n",[223,337,339,342,345,348,351,354,357],{"class":225,"line":338},7,[223,340,341],{"class":229},"  if",[223,343,344],{"class":305}," (",[223,346,347],{"class":237},"error",[223,349,350],{"class":233}," instanceof",[223,352,244],{"class":353},"sBMFI",[223,355,356],{"class":305},") ",[223,358,335],{"class":233},[223,360,362,365,367,370,372,375,378,381,383,385,388,391,394,397,400],{"class":225,"line":361},8,[223,363,364],{"class":237},"    console",[223,366,293],{"class":233},[223,368,369],{"class":301},"warn",[223,371,306],{"class":305},[223,373,374],{"class":233},"`",[223,376,377],{"class":261},"Rate limited until ",[223,379,380],{"class":233},"${",[223,382,347],{"class":237},[223,384,293],{"class":233},[223,386,387],{"class":237},"resetAt",[223,389,390],{"class":233},"?.",[223,392,393],{"class":301},"toISOString",[223,395,396],{"class":237},"()",[223,398,399],{"class":233},"}`",[223,401,317],{"class":305},[223,403,405],{"class":225,"line":404},9,[223,406,407],{"class":233},"  }\n",[223,409,411,414,417,419,421,423,425,427],{"class":225,"line":410},10,[223,412,413],{"class":229},"  else",[223,415,416],{"class":229}," if",[223,418,344],{"class":305},[223,420,347],{"class":237},[223,422,350],{"class":233},[223,424,249],{"class":353},[223,426,356],{"class":305},[223,428,335],{"class":233},[223,430,432,435,438],{"class":225,"line":431},11,[223,433,434],{"class":229},"    await",[223,436,437],{"class":301}," askForNewToken",[223,439,440],{"class":305},"()\n",[223,442,444],{"class":225,"line":443},12,[223,445,407],{"class":233},[223,447,449,451,453,455,457,459,461,463],{"class":225,"line":448},13,[223,450,413],{"class":229},[223,452,416],{"class":229},[223,454,344],{"class":305},[223,456,347],{"class":237},[223,458,350],{"class":233},[223,460,238],{"class":353},[223,462,356],{"class":305},[223,464,335],{"class":233},[223,466,468,470,472,474,476,478,480,483,485,488,490,493,495,497,499,502],{"class":225,"line":467},14,[223,469,364],{"class":237},[223,471,293],{"class":233},[223,473,347],{"class":301},[223,475,306],{"class":305},[223,477,347],{"class":237},[223,479,293],{"class":233},[223,481,482],{"class":237},"forge",[223,484,241],{"class":233},[223,486,487],{"class":237}," error",[223,489,293],{"class":233},[223,491,492],{"class":237},"url",[223,494,241],{"class":233},[223,496,487],{"class":237},[223,498,293],{"class":233},[223,500,501],{"class":237},"message",[223,503,317],{"class":305},[223,505,507],{"class":225,"line":506},15,[223,508,407],{"class":233},[223,510,512,514],{"class":225,"line":511},16,[223,513,413],{"class":229},[223,515,281],{"class":233},[223,517,519,522],{"class":225,"line":518},17,[223,520,521],{"class":229},"    throw",[223,523,524],{"class":237}," error\n",[223,526,528],{"class":225,"line":527},18,[223,529,407],{"class":233},[223,531,533],{"class":225,"line":532},19,[223,534,323],{"class":233},[201,536,537,538,540,541,540,544,546,547,550,551,554,555,558,559,562,563,567],{},"Errors carry ",[205,539,482],{},", ",[205,542,543],{},"instance",[205,545,492],{}," and ",[205,548,549],{},"method"," when the failure came from a request. ",[205,552,553],{},"ForgeApiError"," and its subclasses also have ",[205,556,557],{},"status"," and a truncated ",[205,560,561],{},"body",". The ",[564,565,566],"a",{"href":149},"error reference"," lists every class.",[569,570,572],"h2",{"id":571},"rate-limits","Rate limits",[201,574,575,576,579,580,583,584,586,587,589,590,593],{},"When a forge rate-limits a request and sets ",[205,577,578],{},"retry-after"," to one minute or less, the provider waits that long and retries once. Pass ",[205,581,582],{},"onRetry"," to log or count these retries. It receives the ",[205,585,492],{},", the ",[205,588,549],{}," and the ",[205,591,592],{},"wait"," in milliseconds:",[214,595,597],{"className":216,"code":596,"language":218,"meta":219,"style":219},"const forge = github({\n  auth,\n  onRetry: ({ method, url, wait }) =>\n    console.warn(`Retrying ${method} ${url} in ${wait} ms`),\n}).create()\n",[205,598,599,618,626,656,704],{"__ignoreMap":219},[223,600,601,605,608,611,614,616],{"class":225,"line":226},[223,602,604],{"class":603},"spNyl","const",[223,606,607],{"class":237}," forge ",[223,609,610],{"class":233},"=",[223,612,613],{"class":301}," github",[223,615,306],{"class":237},[223,617,335],{"class":233},[223,619,620,623],{"class":225,"line":268},[223,621,622],{"class":237},"  auth",[223,624,625],{"class":233},",\n",[223,627,628,631,633,636,640,642,645,647,650,653],{"class":225,"line":275},[223,629,630],{"class":301},"  onRetry",[223,632,212],{"class":233},[223,634,635],{"class":233}," ({",[223,637,639],{"class":638},"sHdIc"," method",[223,641,241],{"class":233},[223,643,644],{"class":638}," url",[223,646,241],{"class":233},[223,648,649],{"class":638}," wait",[223,651,652],{"class":233}," })",[223,654,655],{"class":603}," =>\n",[223,657,658,660,662,664,666,668,671,673,675,678,681,683,685,688,690,692,694,697,699,702],{"class":225,"line":284},[223,659,364],{"class":237},[223,661,293],{"class":233},[223,663,369],{"class":301},[223,665,306],{"class":237},[223,667,374],{"class":233},[223,669,670],{"class":261},"Retrying ",[223,672,380],{"class":233},[223,674,549],{"class":237},[223,676,677],{"class":233},"}",[223,679,680],{"class":233}," ${",[223,682,492],{"class":237},[223,684,677],{"class":233},[223,686,687],{"class":261}," in ",[223,689,380],{"class":233},[223,691,592],{"class":237},[223,693,677],{"class":233},[223,695,696],{"class":261}," ms",[223,698,374],{"class":233},[223,700,701],{"class":237},")",[223,703,625],{"class":233},[223,705,706,708,710,712,715],{"class":225,"line":320},[223,707,677],{"class":233},[223,709,701],{"class":237},[223,711,293],{"class":233},[223,713,714],{"class":301},"create",[223,716,440],{"class":237},[201,718,719,720,723,724,726,727,730,731,734],{},"A longer wait, or a second limit, rejects with ",[205,721,722],{},"RateLimitedError",". ",[205,725,387],{}," tells you when the limit resets, and ",[205,728,729],{},"secondary"," is ",[205,732,733],{},"true"," for an abuse limit that has no request counter.",[201,736,737,738,741],{},"After a listing, ",[205,739,740],{},"page.rateLimit"," reports the budget the forge sent with the response.",[569,743,745],{"id":744},"unsupported-operations","Unsupported operations",[201,747,748,749,752,753,293],{},"Calling an operation that the forge lacks rejects with ",[205,750,751],{},"UnsupportedOperationError",". Avoid it with ",[564,754,755],{"href":47},[205,756,757],{},"can()",[569,759,761],{"id":760},"warnings","Warnings",[201,763,764,765,767,768,771,772,293],{},"Some problems don't fail a call. A listing can skip an item it couldn't read, or ignore a filter that the forge lacks. The provider reports these as warnings with a stable ",[205,766,205],{},", such as ",[205,769,770],{},"filter_unsupported"," or ",[205,773,774],{},"thread_unreadable",[201,776,777,778,780],{},"Read ",[205,779,760],{}," on a page, or on an iterable during or after iteration:",[214,782,784],{"className":216,"code":783,"language":218,"meta":219,"style":219},"const threads = gh.threads.list(repo, { sort: 'comments' })\n\nfor await (const thread of threads) {\n  render(thread)\n}\n\nfor (const warning of threads.warnings) {\n  console.warn(warning.code, warning.message)\n}\n",[205,785,786,830,834,857,868,872,876,899,928],{"__ignoreMap":219},[223,787,788,790,793,795,797,799,801,803,806,809,811,813,816,818,820,823,826,828],{"class":225,"line":226},[223,789,604],{"class":603},[223,791,792],{"class":237}," threads ",[223,794,610],{"class":233},[223,796,290],{"class":237},[223,798,293],{"class":233},[223,800,296],{"class":237},[223,802,293],{"class":233},[223,804,805],{"class":301},"list",[223,807,808],{"class":237},"(repo",[223,810,241],{"class":233},[223,812,234],{"class":233},[223,814,815],{"class":305}," sort",[223,817,212],{"class":233},[223,819,258],{"class":233},[223,821,822],{"class":261},"comments",[223,824,825],{"class":233},"'",[223,827,252],{"class":233},[223,829,317],{"class":237},[223,831,832],{"class":225,"line":268},[223,833,272],{"emptyLinePlaceholder":271},[223,835,836,839,842,844,846,849,852,855],{"class":225,"line":275},[223,837,838],{"class":229},"for",[223,840,841],{"class":229}," await",[223,843,344],{"class":237},[223,845,604],{"class":603},[223,847,848],{"class":237}," thread ",[223,850,851],{"class":233},"of",[223,853,854],{"class":237}," threads) ",[223,856,335],{"class":233},[223,858,859,862,864,866],{"class":225,"line":284},[223,860,861],{"class":301},"  render",[223,863,306],{"class":305},[223,865,309],{"class":237},[223,867,317],{"class":305},[223,869,870],{"class":225,"line":320},[223,871,323],{"class":233},[223,873,874],{"class":225,"line":326},[223,875,272],{"emptyLinePlaceholder":271},[223,877,878,880,882,884,887,889,892,894,897],{"class":225,"line":338},[223,879,838],{"class":229},[223,881,344],{"class":237},[223,883,604],{"class":603},[223,885,886],{"class":237}," warning ",[223,888,851],{"class":233},[223,890,891],{"class":237}," threads",[223,893,293],{"class":233},[223,895,896],{"class":237},"warnings) ",[223,898,335],{"class":233},[223,900,901,904,906,908,910,913,915,917,919,922,924,926],{"class":225,"line":361},[223,902,903],{"class":237},"  console",[223,905,293],{"class":233},[223,907,369],{"class":301},[223,909,306],{"class":305},[223,911,912],{"class":237},"warning",[223,914,293],{"class":233},[223,916,205],{"class":237},[223,918,241],{"class":233},[223,920,921],{"class":237}," warning",[223,923,293],{"class":233},[223,925,501],{"class":237},[223,927,317],{"class":305},[223,929,930],{"class":225,"line":404},[223,931,323],{"class":233},[569,933,935],{"id":934},"timeouts","Timeouts",[201,937,938,939,942,943,946,947,293],{},"A request that exceeds the provider's ",[205,940,941],{},"timeout"," rejects with ",[205,944,945],{},"ForgeTimeoutError",". A request that gets no response, for example because of DNS or TLS failures, rejects with ",[205,948,949],{},"ForgeNetworkError",[951,952,953],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":219,"searchDepth":268,"depth":268,"links":955},[956,957,958,959],{"id":571,"depth":268,"text":572},{"id":744,"depth":268,"text":745},{"id":760,"depth":268,"text":761},{"id":934,"depth":268,"text":935},"Catch typed errors, and see how providers retry rate-limited requests.","md",null,{"icon":964},"i-lucide-triangle-alert",{"title":50,"description":960},"a9YksPf_RKQeOSRMaeQjjInbt-6aBlHYlkwYpyNfjag",[968,970],{"title":46,"path":47,"stem":48,"description":969,"children":-1},"Ask a provider whether it supports an operation before you call it.",{"title":54,"path":55,"stem":56,"description":971,"children":-1},"Iterate over listings, or fetch one page at a time and resume later.",1791294003829]