| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066 |
- <!doctype html>
- <html lang="en">
- <head>
- <title data-rh="true">Using DiffUtil.ItemCallback for Efficient RecyclerView Updates | by Sandeep Kella | Medium
- </title>
- <meta data-rh="true" charset="utf-8" />
- <meta data-rh="true" name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1,maximum-scale=1" />
- <meta data-rh="true" name="theme-color" content="#000000" />
- <meta data-rh="true" name="twitter:app:name:iphone" content="Medium" />
- <meta data-rh="true" name="twitter:app:id:iphone" content="828256236" />
- <meta data-rh="true" property="al:ios:app_name" content="Medium" />
- <meta data-rh="true" property="al:ios:app_store_id" content="828256236" />
- <meta data-rh="true" property="al:android:package" content="com.medium.reader" />
- <meta data-rh="true" property="fb:app_id" content="542599432471018" />
- <meta data-rh="true" property="og:site_name" content="Medium" />
- <meta data-rh="true" property="og:type" content="article" />
- <meta data-rh="true" property="article:published_time" content="2024-05-15T23:51:34.732Z" />
- <meta data-rh="true" name="title"
- content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates | by Sandeep Kella | Medium" />
- <meta data-rh="true" property="og:title" content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates" />
- <meta data-rh="true" property="al:android:url" content="medium://p/729615b3528c" />
- <meta data-rh="true" property="al:ios:url" content="medium://p/729615b3528c" />
- <meta data-rh="true" property="al:android:app_name" content="Medium" />
- <meta data-rh="true" name="description"
- content="Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks)…" />
- <meta data-rh="true" property="og:description"
- content="Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" />
- <meta data-rh="true" property="og:url"
- content="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
- <meta data-rh="true" property="al:web:url"
- content="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
- <meta data-rh="true" property="og:image"
- content="https://miro.medium.com/v2/resize:fit:1078/1*9-tDBevuDRdN2pMUN5GJhg.png" />
- <meta data-rh="true" property="article:author" content="https://medium.com/@sandeepkella23" />
- <meta data-rh="true" name="author" content="Sandeep Kella" />
- <meta data-rh="true" name="robots" content="index,noarchive,follow,max-image-preview:large" />
- <meta data-rh="true" name="referrer" content="unsafe-url" />
- <meta data-rh="true" property="twitter:title"
- content="Using DiffUtil.ItemCallback for Efficient RecyclerView Updates" />
- <meta data-rh="true" name="twitter:site" content="@Medium" />
- <meta data-rh="true" name="twitter:app:url:iphone" content="medium://p/729615b3528c" />
- <meta data-rh="true" property="twitter:description"
- content="Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" />
- <meta data-rh="true" name="twitter:image:src"
- content="https://miro.medium.com/v2/resize:fit:1078/1*9-tDBevuDRdN2pMUN5GJhg.png" />
- <meta data-rh="true" name="twitter:card" content="summary_large_image" />
- <meta data-rh="true" name="twitter:label1" content="Reading time" />
- <meta data-rh="true" name="twitter:data1" content="2 min read" />
- <link data-rh="true" rel="icon"
- href="https://miro.medium.com/v2/5d8de952517e8160e40ef9841c781cdc14a5db313057fa3c3de41c6f5b494b19" />
- <link data-rh="true" rel="search" type="application/opensearchdescription+xml" title="Medium" href="/osd.xml" />
- <link data-rh="true" rel="apple-touch-icon" sizes="152x152"
- href="https://miro.medium.com/v2/resize:fill:304:304/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
- <link data-rh="true" rel="apple-touch-icon" sizes="120x120"
- href="https://miro.medium.com/v2/resize:fill:240:240/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
- <link data-rh="true" rel="apple-touch-icon" sizes="76x76"
- href="https://miro.medium.com/v2/resize:fill:152:152/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
- <link data-rh="true" rel="apple-touch-icon" sizes="60x60"
- href="https://miro.medium.com/v2/resize:fill:120:120/10fd5c419ac61637245384e7099e131627900034828f4f386bdaa47a74eae156" />
- <link data-rh="true" rel="mask-icon"
- href="https://miro.medium.com/v2/resize:fill:1000:1000/7*GAOKVe--MXbEJmV9230oOQ.png" color="#171717" />
- <link data-rh="true" id="glyph_preload_link" rel="preload" as="style" type="text/css"
- href="https://glyph.medium.com/css/unbound.css" />
- <link data-rh="true" id="glyph_link" rel="stylesheet" type="text/css"
- href="https://glyph.medium.com/css/unbound.css" />
- <link data-rh="true" rel="author" href="https://medium.com/@sandeepkella23" />
- <link data-rh="true" rel="canonical"
- href="https://medium.com/@sandeepkella23/using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c" />
- <link data-rh="true" rel="alternate" href="android-app://com.medium.reader/https/medium.com/p/729615b3528c" />
- <script data-rh="true"
- type="application/ld+json">{"@context":"http:\u002F\u002Fschema.org","@type":"NewsArticle","image":["https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:1200\u002F1*9-tDBevuDRdN2pMUN5GJhg.png"],"url":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c","dateCreated":"2024-05-15T23:51:34.732Z","datePublished":"2024-05-15T23:51:34.732Z","dateModified":"2024-11-26T11:08:41.326Z","headline":"Using DiffUtil.ItemCallback for Efficient RecyclerView Updates","name":"Using DiffUtil.ItemCallback for Efficient RecyclerView Updates","description":"Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks)…","identifier":"729615b3528c","author":{"@type":"Person","name":"Sandeep Kella","url":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23"},"creator":["Sandeep Kella"],"publisher":{"@type":"Organization","name":"Medium","url":"https:\u002F\u002Fmedium.com\u002F","logo":{"@type":"ImageObject","width":272,"height":60,"url":"https:\u002F\u002Fmiro.medium.com\u002Fv2\u002Fresize:fit:544\u002F7*V1_7XP4snlmqrc_0Njontw.png"}},"mainEntityOfPage":"https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c"}</script>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="STATIC">
- html {
- box-sizing: border-box;
- -webkit-text-size-adjust: 100%
- }
- *,
- *:before,
- *:after {
- box-sizing: inherit
- }
- body {
- margin: 0;
- padding: 0;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- color: rgba(0, 0, 0, 0.8);
- position: relative;
- min-height: 100vh
- }
- h1,
- h2,
- h3,
- h4,
- h5,
- h6,
- dl,
- dd,
- ol,
- ul,
- menu,
- figure,
- blockquote,
- p,
- pre,
- form {
- margin: 0
- }
- menu,
- ol,
- ul {
- padding: 0;
- list-style: none;
- list-style-image: none
- }
- main {
- display: block
- }
- a {
- color: inherit;
- text-decoration: none
- }
- a,
- button,
- input {
- -webkit-tap-highlight-color: transparent
- }
- img,
- svg {
- vertical-align: middle
- }
- button {
- background: transparent;
- overflow: visible
- }
- button,
- input,
- optgroup,
- select,
- textarea {
- margin: 0
- }
- :root {
- --reach-tabs: 1;
- --reach-menu-button: 1
- }
- #speechify-root {
- font-family: Sohne, sans-serif
- }
- div[data-popper-reference-hidden="true"] {
- visibility: hidden;
- pointer-events: none
- }
- .grecaptcha-badge {
- visibility: hidden
- }
- /*XCode style (c) Angel Garcia <angelgarcia.mail@gmail.com>*/
- .hljs {
- background: #fff;
- color: black;
- }
- /* Gray DOCTYPE selectors like WebKit */
- .xml .hljs-meta {
- color: #c0c0c0;
- }
- .hljs-comment,
- .hljs-quote {
- color: #007400;
- }
- .hljs-tag,
- .hljs-attribute,
- .hljs-keyword,
- .hljs-selector-tag,
- .hljs-literal,
- .hljs-name {
- color: #aa0d91;
- }
- .hljs-variable,
- .hljs-template-variable {
- color: #3F6E74;
- }
- .hljs-code,
- .hljs-string,
- .hljs-meta .hljs-string {
- color: #c41a16;
- }
- .hljs-regexp,
- .hljs-link {
- color: #0E0EFF;
- }
- .hljs-title,
- .hljs-symbol,
- .hljs-bullet,
- .hljs-number {
- color: #1c00cf;
- }
- .hljs-section,
- .hljs-meta {
- color: #643820;
- }
- .hljs-title.class_,
- .hljs-class .hljs-title,
- .hljs-type,
- .hljs-built_in,
- .hljs-params {
- color: #5c2699;
- }
- .hljs-attr {
- color: #836C28;
- }
- .hljs-subst {
- color: #000;
- }
- .hljs-formula {
- background-color: #eee;
- font-style: italic;
- }
- .hljs-addition {
- background-color: #baeeba;
- }
- .hljs-deletion {
- background-color: #ffc8bd;
- }
- .hljs-selector-id,
- .hljs-selector-class {
- color: #9b703f;
- }
- .hljs-doctag,
- .hljs-strong {
- font-weight: bold;
- }
- .hljs-emphasis {
- font-style: italic;
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="KEYFRAME">
- @-webkit-keyframes k1 {
- 0% {
- opacity: 0.8
- }
- 50% {
- opacity: 0.5
- }
- 100% {
- opacity: 0.8
- }
- }
- @-moz-keyframes k1 {
- 0% {
- opacity: 0.8
- }
- 50% {
- opacity: 0.5
- }
- 100% {
- opacity: 0.8
- }
- }
- @keyframes k1 {
- 0% {
- opacity: 0.8
- }
- 50% {
- opacity: 0.5
- }
- 100% {
- opacity: 0.8
- }
- }
- @-webkit-keyframes k2 {
- 0% {
- transform: scale(1)
- }
- 50% {
- transform: scale(1.1)
- }
- 100% {
- transform: scale(1)
- }
- }
- @-moz-keyframes k2 {
- 0% {
- transform: scale(1)
- }
- 50% {
- transform: scale(1.1)
- }
- 100% {
- transform: scale(1)
- }
- }
- @keyframes k2 {
- 0% {
- transform: scale(1)
- }
- 50% {
- transform: scale(1.1)
- }
- 100% {
- transform: scale(1)
- }
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE">
- .a {
- font-family: medium-content-sans-serif-font, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif
- }
- .b {
- font-weight: 400
- }
- .c {
- background-color: rgba(255, 255, 255, 1)
- }
- .l {
- display: block
- }
- .m {
- position: sticky
- }
- .n {
- top: 0
- }
- .o {
- z-index: 500
- }
- .p {
- padding: 0 24px
- }
- .q {
- align-items: center
- }
- .r {
- border-bottom: solid 1px #F2F2F2
- }
- .y {
- height: 41px
- }
- .z {
- line-height: 20px
- }
- .ab {
- display: flex
- }
- .ac {
- height: 57px
- }
- .ae {
- flex: 1 0 auto
- }
- .af {
- color: inherit
- }
- .ag {
- fill: inherit
- }
- .ah {
- font-size: inherit
- }
- .ai {
- border: inherit
- }
- .aj {
- font-family: inherit
- }
- .ak {
- letter-spacing: inherit
- }
- .al {
- font-weight: inherit
- }
- .am {
- padding: 0
- }
- .an {
- margin: 0
- }
- .ao {
- cursor: pointer
- }
- .ap:disabled {
- cursor: not-allowed
- }
- .aq:disabled {
- color: #6B6B6B
- }
- .ar:disabled {
- fill: #6B6B6B
- }
- .au {
- width: auto
- }
- .av path {
- fill: #242424
- }
- .aw {
- height: 25px
- }
- .ax {
- margin-left: 16px
- }
- .ay {
- border: none
- }
- .az {
- border-radius: 20px
- }
- .ba {
- width: 240px
- }
- .bb {
- background: #F9F9F9
- }
- .bc path {
- fill: #6B6B6B
- }
- .be {
- outline: none
- }
- .bf {
- font-family: sohne, "Helvetica Neue", Helvetica, Arial, sans-serif
- }
- .bg {
- font-size: 14px
- }
- .bh {
- width: 100%
- }
- .bi {
- padding: 10px 20px 10px 0
- }
- .bj {
- background-color: transparent
- }
- .bk {
- color: #242424
- }
- .bl::placeholder {
- color: #6B6B6B
- }
- .bm {
- display: inline-block
- }
- .bn {
- margin-left: 12px
- }
- .bo {
- margin-right: 12px
- }
- .bp {
- border-radius: 4px
- }
- .bq {
- margin-left: 24px
- }
- .br {
- height: 24px
- }
- .bx {
- background-color: #F9F9F9
- }
- .by {
- border-radius: 50%
- }
- .bz {
- height: 32px
- }
- .ca {
- width: 32px
- }
- .cb {
- justify-content: center
- }
- .ch {
- max-width: 680px
- }
- .ci {
- min-width: 0
- }
- .cj {
- animation: k1 1.2s ease-in-out infinite
- }
- .ck {
- height: 100vh
- }
- .cl {
- margin-bottom: 16px
- }
- .cm {
- margin-top: 48px
- }
- .cn {
- align-items: flex-start
- }
- .co {
- flex-direction: column
- }
- .cp {
- justify-content: space-between
- }
- .cq {
- margin-bottom: 24px
- }
- .cw {
- width: 80%
- }
- .cx {
- background-color: #F2F2F2
- }
- .dd {
- height: 44px
- }
- .de {
- width: 44px
- }
- .df {
- margin: auto 0
- }
- .dg {
- margin-bottom: 4px
- }
- .dh {
- height: 16px
- }
- .di {
- width: 120px
- }
- .dj {
- width: 80px
- }
- .dp {
- margin-bottom: 8px
- }
- .dq {
- width: 96%
- }
- .dr {
- width: 98%
- }
- .ds {
- width: 81%
- }
- .dw {
- margin-left: 8px
- }
- .dx {
- color: #6B6B6B
- }
- .dy {
- font-size: 13px
- }
- .dz {
- height: 100%
- }
- .ec {
- margin-right: 32px
- }
- .ed {
- position: relative
- }
- .ee {
- fill: #6B6B6B
- }
- .eh {
- background: transparent
- }
- .ei svg {
- margin-left: 4px
- }
- .ej svg {
- fill: #6B6B6B
- }
- .el {
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.05)
- }
- .em {
- position: absolute
- }
- .ep {
- box-sizing: border-box
- }
- .ev {
- margin: 0 24px
- }
- .ez {
- background: rgba(255, 255, 255, 1)
- }
- .fa {
- border: 1px solid #F2F2F2
- }
- .fb {
- box-shadow: 0 1px 4px #F2F2F2
- }
- .fc {
- max-height: 100vh
- }
- .fd {
- overflow-y: auto
- }
- .fe {
- left: 0
- }
- .ff {
- top: calc(100vh + 100px)
- }
- .fg {
- bottom: calc(100vh + 100px)
- }
- .fh {
- width: 10px
- }
- .fi {
- pointer-events: none
- }
- .fj {
- word-break: break-word
- }
- .fk {
- word-wrap: break-word
- }
- .fl:after {
- display: block
- }
- .fm:after {
- content: ""
- }
- .fn:after {
- clear: both
- }
- .fo {
- margin-left: auto
- }
- .fp {
- margin-right: auto
- }
- .fq {
- max-width: 1078px
- }
- .fw {
- clear: both
- }
- .fy {
- cursor: zoom-in
- }
- .fz {
- z-index: auto
- }
- .gb {
- max-width: 100%
- }
- .gc {
- height: auto
- }
- .gd {
- line-height: 1.23
- }
- .ge {
- letter-spacing: 0
- }
- .gf {
- font-style: normal
- }
- .gg {
- font-weight: 700
- }
- .hl {
- align-items: baseline
- }
- .hm {
- width: 48px
- }
- .hn {
- height: 48px
- }
- .ho {
- border: 2px solid rgba(255, 255, 255, 1)
- }
- .hp {
- z-index: 0
- }
- .hq {
- box-shadow: none
- }
- .hr {
- border: 1px solid rgba(0, 0, 0, 0.05)
- }
- .hs {
- margin-bottom: 2px
- }
- .ht {
- flex-wrap: nowrap
- }
- .hu {
- font-size: 16px
- }
- .hv {
- line-height: 24px
- }
- .hx {
- margin: 0 8px
- }
- .hy {
- display: inline
- }
- .hz {
- color: #1A8917
- }
- .ia {
- fill: #1A8917
- }
- .ib:disabled {
- opacity: 0.3
- }
- .ie {
- flex: 0 0 auto
- }
- .ih {
- flex-wrap: wrap
- }
- .ii {
- padding-left: 8px
- }
- .ij {
- padding-right: 8px
- }
- .jk>* {
- flex-shrink: 0
- }
- .jl {
- overflow-x: scroll
- }
- .jm::-webkit-scrollbar {
- display: none
- }
- .jn {
- scrollbar-width: none
- }
- .jo {
- -ms-overflow-style: none
- }
- .jp {
- width: 74px
- }
- .jq {
- flex-direction: row
- }
- .jr {
- z-index: 2
- }
- .js {
- margin-right: 4px
- }
- .jv {
- -webkit-user-select: none
- }
- .jw {
- border: 0
- }
- .jx {
- cursor: progress
- }
- .jy {
- fill: rgba(117, 117, 117, 1)
- }
- .kb {
- opacity: 0.25
- }
- .kc {
- outline: 0
- }
- .kd {
- user-select: none
- }
- .ke>svg {
- pointer-events: none
- }
- .kn {
- opacity: 1
- }
- .ko {
- padding: 4px 0
- }
- .kr {
- margin-top: 0px
- }
- .ks {
- width: 16px
- }
- .kt {
- padding: 8px 2px
- }
- .kw svg path {
- fill: #6B6B6B
- }
- .kx {
- display: inline-flex
- }
- .ld svg {
- color: #6B6B6B
- }
- .lu {
- line-height: 1.58
- }
- .lv {
- letter-spacing: -0.004em
- }
- .lw {
- font-family: source-serif-pro, Georgia, Cambria, "Times New Roman", Times, serif
- }
- .mr {
- margin-bottom: -0.46em
- }
- .mx {
- overflow-x: auto
- }
- .my {
- font-family: source-code-pro, Menlo, Monaco, "Courier New", Courier, monospace
- }
- .mz {
- padding: 32px
- }
- .na {
- border: 1px solid #E5E5E5
- }
- .nb {
- line-height: 1.4
- }
- .nc {
- letter-spacing: -0.022em
- }
- .nd {
- margin-top: -0.2em
- }
- .ne {
- margin-bottom: -0.2em
- }
- .nf {
- white-space: pre
- }
- .ng {
- min-width: fit-content
- }
- .nh {
- list-style-type: disc
- }
- .ni {
- margin-left: 30px
- }
- .nj {
- padding-left: 0px
- }
- .nk {
- padding: 2px 4px
- }
- .nl {
- font-size: 75%
- }
- .nm>strong {
- font-family: inherit
- }
- .ns {
- margin-bottom: 26px
- }
- .nt {
- margin-top: 6px
- }
- .nu {
- margin-top: 8px
- }
- .nv {
- margin-right: 8px
- }
- .nw {
- padding: 8px 16px
- }
- .nx {
- border-radius: 100px
- }
- .ny {
- transition: background 300ms ease
- }
- .oa {
- white-space: nowrap
- }
- .ob {
- border-top: none
- }
- .oc {
- margin-bottom: 50px
- }
- .od {
- height: 52px
- }
- .oe {
- max-height: 52px
- }
- .of {
- box-sizing: content-box
- }
- .og {
- position: static
- }
- .oh {
- z-index: 1
- }
- .oj {
- max-width: 155px
- }
- .op {
- margin-right: 20px
- }
- .oq {
- margin-bottom: 64px
- }
- .pf {
- height: 64px
- }
- .pg {
- width: 64px
- }
- .ph {
- align-self: flex-end
- }
- .pi {
- color: #F2F2F2
- }
- .pj {
- fill: #F2F2F2
- }
- .pk {
- background: #F2F2F2
- }
- .pl {
- border-color: #F2F2F2
- }
- .pr:disabled {
- cursor: inherit !important
- }
- .ps:disabled {
- opacity: 0.1
- }
- .pt:disabled:hover {
- background: rgba(25, 25, 25, 1)
- }
- .pu:disabled:hover {
- border-color: rgba(25, 25, 25, 1)
- }
- .pv {
- border-radius: 99em
- }
- .pw {
- border-width: 1px
- }
- .px {
- border-style: solid
- }
- .py {
- text-decoration: none
- }
- .pz {
- text-align: center
- }
- .qa {
- flex: 1 1 auto
- }
- .qg {
- padding-right: 4px
- }
- .qh {
- font-weight: 500
- }
- .qu {
- white-space: pre-wrap
- }
- .qv {
- margin-top: 16px
- }
- .qw {
- margin-bottom: 54px
- }
- .qx {
- height: 0px
- }
- .rn {
- gap: 18px
- }
- .ro {
- fill: rgba(61, 61, 61, 1)
- }
- .sa {
- border-bottom: solid 1px #E5E5E5
- }
- .sb {
- margin-top: 72px
- }
- .sc {
- padding: 24px 0
- }
- .sd {
- margin-bottom: 0px
- }
- .se {
- margin-right: 16px
- }
- .as:hover:not(:disabled) {
- color: rgba(25, 25, 25, 1)
- }
- .at:hover:not(:disabled) {
- fill: rgba(25, 25, 25, 1)
- }
- .ef:hover {
- color: #242424
- }
- .eg:hover {
- fill: #242424
- }
- .ek:hover svg {
- fill: #242424
- }
- .eo:hover {
- background-color: rgba(0, 0, 0, 0.1)
- }
- .hw:hover {
- text-decoration: underline
- }
- .ic:hover:not(:disabled) {
- color: #156D12
- }
- .id:hover:not(:disabled) {
- fill: #156D12
- }
- .ka:hover {
- fill: rgba(117, 117, 117, 1)
- }
- .kp:hover {
- fill: #000000
- }
- .kq:hover p {
- color: #000000
- }
- .ku:hover:not(:disabled) svg path {
- fill: #000000
- }
- .le:hover svg {
- color: #000000
- }
- .nz:hover {
- background-color: #F2F2F2
- }
- .pe:hover {
- background-color: none
- }
- .pm:hover {
- background: #F2F2F2
- }
- .pn:hover {
- border-color: #F2F2F2
- }
- .po:hover {
- cursor: wait
- }
- .pp:hover {
- color: #F2F2F2
- }
- .pq:hover {
- fill: #F2F2F2
- }
- .rp:hover {
- fill: rgba(25, 25, 25, 1)
- }
- .bd:focus-within path {
- fill: #242424
- }
- .ga:focus {
- transform: scale(1.01)
- }
- .jz:focus {
- fill: rgba(117, 117, 117, 1)
- }
- .kv:focus svg path {
- fill: #000000
- }
- .lf:focus svg {
- color: #000000
- }
- .kf:active {
- border-style: none
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (min-width: 1080px)">
- .d {
- display: none
- }
- .bw {
- width: 64px
- }
- .cg {
- margin: 0 64px
- }
- .cv {
- height: 48px
- }
- .dc {
- margin-bottom: 52px
- }
- .do {
- margin-bottom: 48px
- }
- .eb {
- display: flex
- }
- .eu {
- margin-bottom: 50px
- }
- .ey {
- max-width: 680px
- }
- .fv {
- margin-top: 40px
- }
- .hb {
- font-size: 42px
- }
- .hc {
- margin-top: 1em
- }
- .hd {
- margin-bottom: 32px
- }
- .he {
- line-height: 52px
- }
- .hf {
- letter-spacing: -0.011em
- }
- .hk {
- align-items: center
- }
- .iw {
- border-top: solid 1px #F2F2F2
- }
- .ix {
- border-bottom: solid 1px #F2F2F2
- }
- .iy {
- margin: 32px 0 0
- }
- .iz {
- padding: 3px 8px
- }
- .ji>* {
- margin-right: 24px
- }
- .jj> :last-child {
- margin-right: 0
- }
- .km {
- margin-top: 0px
- }
- .lc {
- margin: 0
- }
- .mn {
- font-size: 20px
- }
- .mo {
- margin-top: 2.14em
- }
- .mp {
- line-height: 32px
- }
- .mq {
- letter-spacing: -0.003em
- }
- .mw {
- margin-top: 56px
- }
- .nr {
- margin-top: 1.14em
- }
- .oo {
- display: inline-block
- }
- .or {
- flex-direction: row
- }
- .ou {
- margin-bottom: 0
- }
- .ov {
- margin-right: 20px
- }
- .qb {
- max-width: 500px
- }
- .qs {
- line-height: 24px
- }
- .qt {
- letter-spacing: 0
- }
- .rk {
- font-size: 24px
- }
- .rl {
- line-height: 30px
- }
- .rm {
- letter-spacing: -0.016em
- }
- .ru {
- margin: 40px 0 0
- }
- .rz {
- padding-top: 72px
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 1079.98px)">
- .e {
- display: none
- }
- .kl {
- margin-top: 0px
- }
- .on {
- display: inline-block
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 903.98px)">
- .f {
- display: none
- }
- .kk {
- margin-top: 0px
- }
- .om {
- display: inline-block
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 727.98px)">
- .g {
- display: none
- }
- .ki {
- margin-top: 0px
- }
- .kj {
- margin-right: 0px
- }
- .ol {
- display: inline-block
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="all and (max-width: 551.98px)">
- .h {
- display: none
- }
- .s {
- display: flex
- }
- .t {
- justify-content: space-between
- }
- .bs {
- width: 24px
- }
- .cc {
- margin: 0 24px
- }
- .cr {
- height: 40px
- }
- .cy {
- margin-bottom: 44px
- }
- .dk {
- margin-bottom: 32px
- }
- .dt {
- justify-content: center
- }
- .eq {
- margin-bottom: 2px
- }
- .fr {
- margin-top: 32px
- }
- .gh {
- font-size: 32px
- }
- .gi {
- margin-top: 1.01em
- }
- .gj {
- margin-bottom: 24px
- }
- .gk {
- line-height: 38px
- }
- .gl {
- letter-spacing: -0.014em
- }
- .hg {
- align-items: flex-start
- }
- .if {
- flex-direction: column
- }
- .ik {
- margin: 24px -24px 0
- }
- .il {
- padding: 0
- }
- .ja>* {
- margin-right: 8px
- }
- .jb> :last-child {
- margin-right: 24px
- }
- .jt {
- margin-left: 0px
- }
- .kg {
- margin-top: 0px
- }
- .kh {
- margin-right: 0px
- }
- .ky {
- margin: 0
- }
- .lg {
- border: 1px solid #F2F2F2
- }
- .lh {
- border-radius: 99em
- }
- .li {
- padding: 0px 16px 0px 12px
- }
- .lj {
- height: 38px
- }
- .lk {
- align-items: center
- }
- .lm svg {
- margin-right: 8px
- }
- .lx {
- font-size: 18px
- }
- .ly {
- margin-top: 1.56em
- }
- .lz {
- line-height: 28px
- }
- .ma {
- letter-spacing: -0.003em
- }
- .ms {
- margin-top: 40px
- }
- .nn {
- margin-top: 1.34em
- }
- .ok {
- display: inline-block
- }
- .pc {
- margin-bottom: 20px
- }
- .pd {
- margin-right: 0
- }
- .qf {
- max-width: 100%
- }
- .qi {
- font-size: 24px
- }
- .qj {
- line-height: 30px
- }
- .qk {
- letter-spacing: -0.016em
- }
- .qy {
- font-size: 20px
- }
- .qz {
- line-height: 24px
- }
- .ra {
- letter-spacing: 0
- }
- .rq {
- margin: 32px 0 0
- }
- .rv {
- padding-top: 48px
- }
- .ll:hover {
- border-color: #E5E5E5
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
- media="all and (min-width: 904px) and (max-width: 1079.98px)">
- .i {
- display: none
- }
- .bv {
- width: 64px
- }
- .cf {
- margin: 0 64px
- }
- .cu {
- height: 48px
- }
- .db {
- margin-bottom: 52px
- }
- .dn {
- margin-bottom: 48px
- }
- .ea {
- display: flex
- }
- .et {
- margin-bottom: 50px
- }
- .ex {
- max-width: 680px
- }
- .fu {
- margin-top: 40px
- }
- .gw {
- font-size: 42px
- }
- .gx {
- margin-top: 1em
- }
- .gy {
- margin-bottom: 32px
- }
- .gz {
- line-height: 52px
- }
- .ha {
- letter-spacing: -0.011em
- }
- .hj {
- align-items: center
- }
- .is {
- border-top: solid 1px #F2F2F2
- }
- .it {
- border-bottom: solid 1px #F2F2F2
- }
- .iu {
- margin: 32px 0 0
- }
- .iv {
- padding: 3px 8px
- }
- .jg>* {
- margin-right: 24px
- }
- .jh> :last-child {
- margin-right: 0
- }
- .lb {
- margin: 0
- }
- .mj {
- font-size: 20px
- }
- .mk {
- margin-top: 2.14em
- }
- .ml {
- line-height: 32px
- }
- .mm {
- letter-spacing: -0.003em
- }
- .mv {
- margin-top: 56px
- }
- .nq {
- margin-top: 1.14em
- }
- .os {
- flex-direction: row
- }
- .ow {
- margin-bottom: 0
- }
- .ox {
- margin-right: 20px
- }
- .qc {
- max-width: 500px
- }
- .qq {
- line-height: 24px
- }
- .qr {
- letter-spacing: 0
- }
- .rh {
- font-size: 24px
- }
- .ri {
- line-height: 30px
- }
- .rj {
- letter-spacing: -0.016em
- }
- .rt {
- margin: 40px 0 0
- }
- .ry {
- padding-top: 72px
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
- media="all and (min-width: 728px) and (max-width: 903.98px)">
- .j {
- display: none
- }
- .w {
- display: flex
- }
- .x {
- justify-content: space-between
- }
- .bu {
- width: 64px
- }
- .ce {
- margin: 0 48px
- }
- .ct {
- height: 48px
- }
- .da {
- margin-bottom: 52px
- }
- .dm {
- margin-bottom: 48px
- }
- .dv {
- justify-content: center
- }
- .es {
- margin-bottom: 50px
- }
- .ew {
- max-width: 680px
- }
- .ft {
- margin-top: 40px
- }
- .gr {
- font-size: 42px
- }
- .gs {
- margin-top: 1em
- }
- .gt {
- margin-bottom: 32px
- }
- .gu {
- line-height: 52px
- }
- .gv {
- letter-spacing: -0.011em
- }
- .hi {
- align-items: center
- }
- .io {
- border-top: solid 1px #F2F2F2
- }
- .ip {
- border-bottom: solid 1px #F2F2F2
- }
- .iq {
- margin: 32px 0 0
- }
- .ir {
- padding: 3px 8px
- }
- .je>* {
- margin-right: 24px
- }
- .jf> :last-child {
- margin-right: 0
- }
- .la {
- margin: 0
- }
- .mf {
- font-size: 20px
- }
- .mg {
- margin-top: 2.14em
- }
- .mh {
- line-height: 32px
- }
- .mi {
- letter-spacing: -0.003em
- }
- .mu {
- margin-top: 56px
- }
- .np {
- margin-top: 1.14em
- }
- .ot {
- flex-direction: row
- }
- .oy {
- margin-bottom: 0
- }
- .oz {
- margin-right: 20px
- }
- .qd {
- max-width: 500px
- }
- .qo {
- line-height: 24px
- }
- .qp {
- letter-spacing: 0
- }
- .re {
- font-size: 24px
- }
- .rf {
- line-height: 30px
- }
- .rg {
- letter-spacing: -0.016em
- }
- .rs {
- margin: 40px 0 0
- }
- .rx {
- padding-top: 72px
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
- media="all and (min-width: 552px) and (max-width: 727.98px)">
- .k {
- display: none
- }
- .u {
- display: flex
- }
- .v {
- justify-content: space-between
- }
- .bt {
- width: 24px
- }
- .cd {
- margin: 0 24px
- }
- .cs {
- height: 40px
- }
- .cz {
- margin-bottom: 44px
- }
- .dl {
- margin-bottom: 32px
- }
- .du {
- justify-content: center
- }
- .er {
- margin-bottom: 2px
- }
- .fs {
- margin-top: 32px
- }
- .gm {
- font-size: 32px
- }
- .gn {
- margin-top: 1.01em
- }
- .go {
- margin-bottom: 24px
- }
- .gp {
- line-height: 38px
- }
- .gq {
- letter-spacing: -0.014em
- }
- .hh {
- align-items: flex-start
- }
- .ig {
- flex-direction: column
- }
- .im {
- margin: 24px 0 0
- }
- .in {
- padding: 0
- }
- .jc>* {
- margin-right: 8px
- }
- .jd> :last-child {
- margin-right: 8px
- }
- .ju {
- margin-left: 0px
- }
- .kz {
- margin: 0
- }
- .ln {
- border: 1px solid #F2F2F2
- }
- .lo {
- border-radius: 99em
- }
- .lp {
- padding: 0px 16px 0px 12px
- }
- .lq {
- height: 38px
- }
- .lr {
- align-items: center
- }
- .lt svg {
- margin-right: 8px
- }
- .mb {
- font-size: 18px
- }
- .mc {
- margin-top: 1.56em
- }
- .md {
- line-height: 28px
- }
- .me {
- letter-spacing: -0.003em
- }
- .mt {
- margin-top: 40px
- }
- .no {
- margin-top: 1.34em
- }
- .pa {
- margin-bottom: 20px
- }
- .pb {
- margin-right: 0
- }
- .qe {
- max-width: 100%
- }
- .ql {
- font-size: 24px
- }
- .qm {
- line-height: 30px
- }
- .qn {
- letter-spacing: -0.016em
- }
- .rb {
- font-size: 20px
- }
- .rc {
- line-height: 24px
- }
- .rd {
- letter-spacing: 0
- }
- .rr {
- margin: 32px 0 0
- }
- .rw {
- padding-top: 48px
- }
- .ls:hover {
- border-color: #E5E5E5
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE" media="print">
- .oi {
- display: none
- }
- </style>
- <style type="text/css" data-fela-rehydration="498" data-fela-type="RULE"
- media="(prefers-reduced-motion: no-preference)">
- .fx {
- transition: transform 300ms cubic-bezier(0.2, 0, 0.2, 1)
- }
- </style>
- </head>
- <body>
- <div id="root">
- <div class="a b c">
- <div class="d e f g h i j k"></div>
- <script>document.domain = document.domain;</script>
- <div class="l c">
- <div class="l m n o c">
- <div class="am q r s dt u du w dv i d y z"><a
- class="dx ag dy bf ak b am an ao ap aq ar as at s u w i d q dz z"
- href="https://rsci.app.link/?%24canonical_url=https%3A%2F%2Fmedium.com%2Fp%2F729615b3528c&%7Efeature=LiOpenInAppButton&%7Echannel=ShowPostUnderUser&source=---top_nav_layout_nav----------------------------------"
- rel="noopener follow">Open in app<svg xmlns="http://www.w3.org/2000/svg" width="10" height="10"
- fill="none" viewBox="0 0 10 10" class="dw">
- <path fill="currentColor"
- d="M.985 8.485a.375.375 0 1 0 .53.53zM8.75 1.25h.375A.375.375 0 0 0 8.75.875zM8.375 6.5a.375.375 0 1 0 .75 0zM3.5.875a.375.375 0 1 0 0 .75zm-1.985 8.14 7.5-7.5-.53-.53-7.5 7.5zm6.86-7.765V6.5h.75V1.25zM3.5 1.625h5.25v-.75H3.5z">
- </path>
- </svg></a></div>
- <div class="p q r ab ac">
- <div class="ab q ae"><a class="af ag ah ai aj ak al am an ao ap aq ar as at ab" aria-label="Homepage"
- data-testid="headerMediumLogo" rel="noopener follow"
- href="/?source=---top_nav_layout_nav----------------------------------"><svg
- xmlns="http://www.w3.org/2000/svg" width="719" height="160" fill="none" viewBox="0 0 719 160"
- class="au av aw">
- <path fill="#242424"
- d="m174.104 9.734.215-.047V8.02H130.39L89.6 103.89 48.81 8.021H1.472v1.666l.212.047c8.018 1.81 12.09 4.509 12.09 14.242V137.93c0 9.734-4.087 12.433-12.106 14.243l-.212.047v1.671h32.118v-1.665l-.213-.048c-8.018-1.809-12.089-4.509-12.089-14.242V30.586l52.399 123.305h2.972l53.925-126.743V140.75c-.687 7.688-4.721 10.062-11.982 11.701l-.215.05v1.652h55.948v-1.652l-.215-.05c-7.269-1.639-11.4-4.013-12.087-11.701l-.037-116.774h.037c0-9.733 4.071-12.432 12.087-14.242m25.555 75.488c.915-20.474 8.268-35.252 20.606-35.507 3.806.063 6.998 1.312 9.479 3.714 5.272 5.118 7.751 15.812 7.368 31.793zm-.553 5.77h65.573v-.275c-.186-15.656-4.721-27.834-13.466-36.196-7.559-7.227-18.751-11.203-30.507-11.203h-.263c-6.101 0-13.584 1.48-18.909 4.16-6.061 2.807-11.407 7.003-15.855 12.511-7.161 8.874-11.499 20.866-12.554 34.343q-.05.606-.092 1.212a50 50 0 0 0-.065 1.151 85.807 85.807 0 0 0-.094 5.689c.71 30.524 17.198 54.917 46.483 54.917 25.705 0 40.675-18.791 44.407-44.013l-1.886-.664c-6.557 13.556-18.334 21.771-31.738 20.769-18.297-1.369-32.314-19.922-31.042-42.395m139.722 41.359c-2.151 5.101-6.639 7.908-12.653 7.908s-11.513-4.129-15.418-11.63c-4.197-8.053-6.405-19.436-6.405-32.92 0-28.067 8.729-46.22 22.24-46.22 5.657 0 10.111 2.807 12.236 7.704zm43.499 20.008c-8.019-1.897-12.089-4.722-12.089-14.951V1.309l-48.716 14.353v1.757l.299-.024c6.72-.543 11.278.386 13.925 2.83 2.072 1.915 3.082 4.853 3.082 8.987v18.66c-4.803-3.067-10.516-4.56-17.448-4.56-14.059 0-26.909 5.92-36.176 16.672-9.66 11.205-14.767 26.518-14.767 44.278-.003 31.72 15.612 53.039 38.851 53.039 13.595 0 24.533-7.449 29.54-20.013v16.865h43.711v-1.746zM424.1 19.819c0-9.904-7.468-17.374-17.375-17.374-9.859 0-17.573 7.632-17.573 17.374s7.721 17.374 17.573 17.374c9.907 0 17.375-7.47 17.375-17.374m11.499 132.546c-8.019-1.897-12.089-4.722-12.089-14.951h-.035V43.635l-43.714 12.551v1.705l.263.024c9.458.842 12.047 4.1 12.047 15.152v81.086h43.751v-1.746zm112.013 0c-8.018-1.897-12.089-4.722-12.089-14.951V43.635l-41.621 12.137v1.71l.246.026c7.733.813 9.967 4.257 9.967 15.36v59.279c-2.578 5.102-7.415 8.131-13.274 8.336-9.503 0-14.736-6.419-14.736-18.073V43.638l-43.714 12.55v1.703l.262.024c9.459.84 12.05 4.097 12.05 15.152v50.17a56.3 56.3 0 0 0 .91 10.444l.787 3.423c3.701 13.262 13.398 20.197 28.59 20.197 12.868 0 24.147-7.966 29.115-20.43v17.311h43.714v-1.747zm169.818 1.788v-1.749l-.213-.05c-8.7-2.006-12.089-5.789-12.089-13.49v-63.79c0-19.89-11.171-31.761-29.883-31.761-13.64 0-25.141 7.882-29.569 20.16-3.517-13.01-13.639-20.16-28.606-20.16-13.146 0-23.449 6.938-27.869 18.657V43.643L545.487 55.68v1.715l.263.024c9.345.829 12.047 4.181 12.047 14.95v81.784h40.787v-1.746l-.215-.053c-6.941-1.631-9.181-4.606-9.181-12.239V66.998c1.836-4.289 5.537-9.37 12.853-9.37 9.086 0 13.692 6.296 13.692 18.697v77.828h40.797v-1.746l-.215-.053c-6.94-1.631-9.18-4.606-9.18-12.239V75.066a42 42 0 0 0-.578-7.26c1.947-4.661 5.86-10.177 13.475-10.177 9.214 0 13.691 6.114 13.691 18.696v77.828z">
- </path>
- </svg></a>
- <div class="ax h">
- <div class="ab ay az ba bb q bc bd">
- <div class="bm" aria-hidden="false" aria-describedby="searchResults" aria-labelledby="searchResults">
- </div>
- <div class="bn bo ab"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z"
- clip-rule="evenodd"></path>
- </svg></div><input role="combobox" aria-controls="searchResults" aria-expanded="false"
- aria-label="search" data-testid="headerSearchInput" tabindex="0"
- class="ay be bf bg z bh bi bj bk bl" placeholder="Search" value="" />
- </div>
- </div>
- </div>
- <div class="h k w ea eb">
- <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" data-testid="headerWriteButton"
- href="https://medium.com/new-story?source=---top_nav_layout_nav----------------------------------"
- rel="noopener follow">
- <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
- height="24" fill="none" viewBox="0 0 24 24" aria-label="Write">
- <path fill="currentColor"
- d="M14 4a.5.5 0 0 0 0-1zm7 6a.5.5 0 0 0-1 0zm-7-7H4v1h10zM3 4v16h1V4zm1 17h16v-1H4zm17-1V10h-1v10zm-1 1a1 1 0 0 0 1-1h-1zM3 20a1 1 0 0 0 1 1v-1zM4 3a1 1 0 0 0-1 1h1z">
- </path>
- <path stroke="currentColor"
- d="m17.5 4.5-8.458 8.458a.25.25 0 0 0-.06.098l-.824 2.47a.25.25 0 0 0 .316.316l2.47-.823a.25.25 0 0 0 .098-.06L19.5 6.5m-2-2 2.323-2.323a.25.25 0 0 1 .354 0l1.646 1.646a.25.25 0 0 1 0 .354L19.5 6.5m-2-2 2 2">
- </path>
- </svg>
- <div class="dw l">Write</div>
- </div>
- </a></div>
- </div>
- <div class="k j i d">
- <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- data-testid="headerSearchButton" rel="noopener follow"
- href="/search?source=---top_nav_layout_nav----------------------------------">
- <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
- height="24" fill="none" viewBox="0 0 24 24" aria-label="Search">
- <path fill="currentColor" fill-rule="evenodd"
- d="M4.092 11.06a6.95 6.95 0 1 1 13.9 0 6.95 6.95 0 0 1-13.9 0m6.95-8.05a8.05 8.05 0 1 0 5.13 14.26l3.75 3.75a.56.56 0 1 0 .79-.79l-3.73-3.73A8.05 8.05 0 0 0 11.042 3z"
- clip-rule="evenodd"></path>
- </svg></div>
- </a></div>
- </div>
- <div class="ec ab"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- data-testid="headerNotificationButton" rel="noopener follow"
- href="/me/notifications?source=---top_nav_layout_nav----------------------------------">
- <div class="bf b bg z dx ed ee ab q ef eg"><svg xmlns="http://www.w3.org/2000/svg" width="24"
- height="24" fill="none" viewBox="0 0 24 24" aria-label="Notifications">
- <path stroke="currentColor" stroke-linecap="round" d="M15 18.5a3 3 0 1 1-6 0"></path>
- <path stroke="currentColor" stroke-linejoin="round"
- d="M5.5 10.532V9a6.5 6.5 0 0 1 13 0v1.532c0 1.42.564 2.782 1.568 3.786l.032.032c.256.256.4.604.4.966v2.934a.25.25 0 0 1-.25.25H3.75a.25.25 0 0 1-.25-.25v-2.934c0-.363.144-.71.4-.966l.032-.032A5.35 5.35 0 0 0 5.5 10.532Z">
- </path>
- </svg></div>
- </a></div>
- <div class="l" aria-hidden="false"><button class="ay eh am ab q ao ei ej ek" aria-label="user options menu"
- data-testid="headerUserIcon">
- <div class="l ed">
- <div class="l ed"><img alt="Guoziyun" class="l ep by bz ca cx"
- src="https://miro.medium.com/v2/resize:fill:64:64/0*tPpe_E0eT2MCh2h2" width="32" height="32"
- loading="lazy" />
- <div class="el by l bz ca em n ay eo"></div>
- </div>
- </div>
- </button></div>
- </div>
- </div>
- <div class="l">
- <div class="eq er es et eu l">
- <div class="ab cb">
- <div class="ci bh ev ew ex ey"></div>
- </div>
- <article>
- <div class="l">
- <div class="l"><span class="l"></span>
- <section>
- <div>
- <div class="em fe ff fg fh fi"></div>
- <div class="fj fk fl fm fn">
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <figure class="fr fs ft fu fv fw fo fp paragraph-image">
- <div role="button" tabindex="0" class="fx fy ed fz bh ga">
- <div class="fo fp fq">
- <picture>
- <source
- srcSet="https://miro.medium.com/v2/resize:fit:640/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 640w, https://miro.medium.com/v2/resize:fit:720/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 720w, https://miro.medium.com/v2/resize:fit:750/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 750w, https://miro.medium.com/v2/resize:fit:786/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 786w, https://miro.medium.com/v2/resize:fit:828/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 828w, https://miro.medium.com/v2/resize:fit:1100/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/format:webp/1*9-tDBevuDRdN2pMUN5GJhg.png 1400w"
- sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px"
- type="image/webp" />
- <source data-testid="og"
- srcSet="https://miro.medium.com/v2/resize:fit:640/1*9-tDBevuDRdN2pMUN5GJhg.png 640w, https://miro.medium.com/v2/resize:fit:720/1*9-tDBevuDRdN2pMUN5GJhg.png 720w, https://miro.medium.com/v2/resize:fit:750/1*9-tDBevuDRdN2pMUN5GJhg.png 750w, https://miro.medium.com/v2/resize:fit:786/1*9-tDBevuDRdN2pMUN5GJhg.png 786w, https://miro.medium.com/v2/resize:fit:828/1*9-tDBevuDRdN2pMUN5GJhg.png 828w, https://miro.medium.com/v2/resize:fit:1100/1*9-tDBevuDRdN2pMUN5GJhg.png 1100w, https://miro.medium.com/v2/resize:fit:1400/1*9-tDBevuDRdN2pMUN5GJhg.png 1400w"
- sizes="(min-resolution: 4dppx) and (max-width: 700px) 50vw, (-webkit-min-device-pixel-ratio: 4) and (max-width: 700px) 50vw, (min-resolution: 3dppx) and (max-width: 700px) 67vw, (-webkit-min-device-pixel-ratio: 3) and (max-width: 700px) 65vw, (min-resolution: 2.5dppx) and (max-width: 700px) 80vw, (-webkit-min-device-pixel-ratio: 2.5) and (max-width: 700px) 80vw, (min-resolution: 2dppx) and (max-width: 700px) 100vw, (-webkit-min-device-pixel-ratio: 2) and (max-width: 700px) 100vw, 700px" />
- <img alt="" class="bh gb gc c" width="700" height="367" loading="eager"
- role="presentation" />
- </picture>
- </div>
- </div>
- </figure>
- <div>
- <h1 id="d09a"
- class="pw-post-title gd ge gf bf gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf bk"
- data-testid="storyTitle">Using DiffUtil.ItemCallback for Efficient RecyclerView Updates
- </h1>
- <div>
- <div class="speechify-ignore ab cp">
- <div class="speechify-ignore bh l">
- <div class="hg hh hi hj hk ab">
- <div>
- <div class="ab hl">
- <div>
- <div class="bm" aria-hidden="false"><a rel="noopener follow"
- href="/@sandeepkella23?source=post_page---byline--729615b3528c--------------------------------">
- <div class="l hm hn by ho hp">
- <div class="l ed"><img alt="Sandeep Kella" class="l ep by dd de cx"
- src="https://miro.medium.com/v2/resize:fill:88:88/1*m4ij-Lr2ZViGgYmypjtQ9A.png"
- width="44" height="44" loading="lazy" data-testid="authorPhoto" />
- <div class="hq by l dd de em n hr eo"></div>
- </div>
- </div>
- </a></div>
- </div>
- </div>
- </div>
- <div class="bn bh l">
- <div class="ab">
- <div style="flex:1"><span class="bf b bg z bk">
- <div class="hs ab q">
- <div class="ab q ht">
- <div class="ab q">
- <div>
- <div class="bm" aria-hidden="false">
- <p class="bf b hu hv bk"><a
- class="af ag ah ai aj ak al am an ao ap aq ar hw"
- data-testid="authorName" rel="noopener follow"
- href="/@sandeepkella23?source=post_page---byline--729615b3528c--------------------------------">Sandeep
- Kella</a></p>
- </div>
- </div>
- </div><span class="hx hy" aria-hidden="true"><span
- class="bf b bg z dx">·</span></span>
- <p class="bf b hu hv dx"><button
- class="hz ia ah ai aj ak al am an ao ap aq ar ib ic id"
- disabled="">Follow</button></p>
- </div>
- </div>
- </span></div>
- </div>
- <div class="l ie"><span class="bf b bg z dx">
- <div class="ab cn if ig ih"><span class="bf b bg z dx">
- <div class="ab ae"><span data-testid="storyReadTime">2 min read</span>
- <div class="ii ij l" aria-hidden="true"><span class="l"
- aria-hidden="true"><span class="bf b bg z dx">·</span></span>
- </div><span data-testid="storyPublishDate">May 15, 2024</span>
- </div>
- </span></div>
- </span></div>
- </div>
- </div>
- <div class="ab cp ik il im in io ip iq ir is it iu iv iw ix iy iz">
- <div class="h k w ea eb q">
- <div class="jp l">
- <div class="ab q jq jr">
- <div class="pw-multi-vote-icon ed js jt ju jv">
- <div class="">
- <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24"
- viewBox="0 0 24 24" aria-label="clap">
- <path fill-rule="evenodd"
- d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
- clip-rule="evenodd"></path>
- <path fill-rule="evenodd"
- d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
- clip-rule="evenodd"></path>
- </svg></div>
- </div>
- </div>
- <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
- <p class="bf b dy z dx"><span class="jx">--</span></p>
- </div>
- </div>
- </div>
- <div>
- <div class="bm" aria-hidden="false"><button class="ao jw kn ko ab q ee kp kq"
- aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24"
- height="24" viewBox="0 0 24 24" class="kr">
- <path
- d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z">
- </path>
- </svg></button></div>
- </div>
- </div>
- <div class="ab q ja jb jc jd je jf jg jh ji jj jk jl jm jn jo">
- <div class="ks k j i d"></div>
- <div class="h k">
- <div>
- <div class="bm" aria-hidden="false"><button
- aria-controls="addToCatalogBookmarkButton" aria-expanded="false"
- aria-label="Add to list bookmark button"
- data-testid="headerBookmarkButton"
- class="af ee ah ai aj ak al kt an ao ap ib ku kv kw" disabled=""><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24" class="av">
- <path fill="#000"
- d="M17.5 1.25a.5.5 0 0 1 1 0v2.5H21a.5.5 0 0 1 0 1h-2.5v2.5a.5.5 0 0 1-1 0v-2.5H15a.5.5 0 0 1 0-1h2.5zm-11 4.5a1 1 0 0 1 1-1H11a.5.5 0 0 0 0-1H7.5a2 2 0 0 0-2 2v14a.5.5 0 0 0 .8.4l5.7-4.4 5.7 4.4a.5.5 0 0 0 .8-.4v-8.5a.5.5 0 0 0-1 0v7.48l-5.2-4a.5.5 0 0 0-.6 0l-5.2 4z">
- </path>
- </svg></button></div>
- </div>
- </div>
- <div class="ep kx cn">
- <div class="l ae">
- <div class="ab cb">
- <div class="ky kz la lb lc gb ci bh">
- <div class="ab">
- <div class="bm bh" aria-hidden="false">
- <div>
- <div class="bm" aria-hidden="false"><button aria-label="Listen"
- data-testid="audioPlayButton"
- class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24"
- fill="none" viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M3 12a9 9 0 1 1 18 0 9 9 0 0 1-18 0m9-10C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2m3.376 10.416-4.599 3.066a.5.5 0 0 1-.777-.416V8.934a.5.5 0 0 1 .777-.416l4.599 3.066a.5.5 0 0 1 0 .832"
- clip-rule="evenodd"></path>
- </svg>
- <div class="j i d">
- <p class="bf b bg z dx">Listen</p>
- </div>
- </button></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu"
- aria-labelledby="postFooterSocialMenu">
- <div>
- <div class="bm" aria-hidden="false"><button
- aria-controls="postFooterSocialMenu" aria-expanded="false"
- aria-label="Share Post" data-testid="headerSocialShareButton"
- class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1"
- clip-rule="evenodd"></path>
- </svg>
- <div class="j i d">
- <p class="bf b bg z dx">Share</p>
- </div>
- </button></div>
- </div>
- </div>
- <div class="bm" aria-hidden="false">
- <div>
- <div class="bm" aria-hidden="false"><button aria-label="More options"
- data-testid="headerStoryOptionsButton"
- class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf lg lh li lj s lk ll lm ln lo lp lq u lr ls lt"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M4.385 12c0 .55.2 1.02.59 1.41.39.4.86.59 1.41.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.02.2-1.41.59-.4.39-.59.86-.59 1.41m5.62 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.42.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.03.2-1.42.59s-.58.86-.58 1.41m5.6 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.43.59s1.03-.2 1.42-.59.58-.86.58-1.41-.2-1.02-.58-1.41a1.93 1.93 0 0 0-1.42-.59c-.56 0-1.04.2-1.43.59s-.58.86-.58 1.41"
- clip-rule="evenodd"></path>
- </svg>
- <div class="j i d">
- <p class="bf b bg z dx">More</p>
- </div>
- </button></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <p id="384c"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:</p>
- <p id="6332"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- <strong class="lw gg">Use Case:</strong> Imagine you have a RecyclerView displaying a list
- of tasks. When a user marks a task as complete, you want to update the UI to reflect the
- change (e.g., strikethrough for completed tasks).</p>
- <p id="dd75"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- <strong class="lw gg">DiffUtil.ItemCallback Implementation:</strong></p>
- <pre
- class="ms mt mu mv mw mx my mz bp na bb bk"><span id="f5c1" class="nb nc gf my b bg nd ne l nf ng">public class TaskAdapter extends RecyclerView.Adapter<TaskViewHolder> {<br/>private List<Task> tasks;<br/> public TaskAdapter(List<Task> tasks) {<br/> this.tasks = tasks;<br/> }<br/> @Override<br/> public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {<br/> // ... (inflate view layout for the task)<br/> return new TaskViewHolder(itemView);<br/> }<br/> @Override<br/> public void onBindViewHolder(TaskViewHolder holder, int position) {<br/> Task task = tasks.get(position);<br/> holder.taskTextView.setText(task.getTitle());<br/> holder.taskCompletedView.setVisibility(task.isCompleted() ? View.VISIBLE : View.GONE);<br/> }<br/> @Override<br/> public int getItemCount() {<br/> return tasks.size();<br/> }<br/> public void updateTasks(List<Task> newTasks) {<br/> DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.ItemCallback() {<br/> @Override<br/> public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {<br/> return tasks.get(oldItemPosition).getId() == newTasks.get(newItemPosition).getId();<br/> }<br/> @Override<br/> public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {<br/> Task oldTask = tasks.get(oldItemPosition);<br/> Task newTask = newTasks.get(newItemPosition);<br/> return oldTask.getId() == newTask.getId() &&<br/> oldTask.getTitle().equals(newTask.getTitle()) &&<br/> oldTask.isCompleted() == newTask.isCompleted();<br/> }<br/> });<br/> tasks = newTasks;<br/> diffResult.dispatchUpdatesTo(this);<br/> }<br/>}</span></pre>
- <p id="0d5e"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- <strong class="lw gg">Explanation:</strong></p>
- <ul class="">
- <li id="8d71"
- class="lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr nh ni nj bk">
- The <code class="cx nk nl nm my b">TaskAdapter</code> manages a list of <code
- class="cx nk nl nm my b">Task</code> objects.</li>
- <li id="1627"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- The <code class="cx nk nl nm my b">updateTasks</code> method takes a new list of tasks.
- </li>
- <li id="182d"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- We use <code class="cx nk nl nm my b">DiffUtil.calculateDiff</code> to compare the old
- (<code class="cx nk nl nm my b">tasks</code>) and new (<code
- class="cx nk nl nm my b">newTasks</code>) lists based on the provided <code
- class="cx nk nl nm my b">DiffUtil.ItemCallback</code> implementation.</li>
- <li id="f9dc"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- <code class="cx nk nl nm my b">areItemsTheSame</code>: This method checks if two items
- represent the same underlying data object. Here, we compare task IDs to ensure
- we're dealing with the same task even if its content changes.</li>
- <li id="2433"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- <code class="cx nk nl nm my b">areContentsTheSame</code>: This method checks if the
- content of two items has changed. We compare the task ID, title, and completion status
- to determine if an update is necessary.</li>
- <li id="f7da"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- The <code class="cx nk nl nm my b">DiffUtil.calculateDiff</code> method returns a <code
- class="cx nk nl nm my b">DiffUtil.DiffResult</code> object containing the minimal set
- of changes required (insertions, deletions, or changes).</li>
- <li id="f995"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- We update the adapter’s internal data list to the new list (<code
- class="cx nk nl nm my b">tasks = newTasks</code>).</li>
- <li id="5714"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- Finally, we call <code
- class="cx nk nl nm my b">diffResult.dispatchUpdatesTo(this)</code> which efficiently
- updates the RecyclerView based on the calculated changes, avoiding unnecessary full view
- refreshes.</li>
- </ul>
- <p id="6a57"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- <strong class="lw gg">Benefits:</strong></p>
- <p id="d853"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- In this example, DiffUtil helps efficiently update the UI only for tasks that have
- actually changed (completed or not). This improves performance and provides a smoother
- user experience.</p>
- <p id="6ef6"
- class="pw-post-body-paragraph lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr fj bk">
- <strong class="lw gg">Additional Notes:</strong></p>
- <ul class="">
- <li id="de2b"
- class="lu lv gf lw b lx ly lz ma mb mc md me mf mg mh mi mj mk ml mm mn mo mp mq mr nh ni nj bk">
- You can customize the comparison logic in <code
- class="cx nk nl nm my b">DiffUtil.ItemCallback</code> based on your data structure and
- needs.</li>
- <li id="90b2"
- class="lu lv gf lw b lx nn lz ma mb no md me mf np mh mi mj nq ml mm mn nr mp mq mr nh ni nj bk">
- This is a basic example. DiffUtil offers additional methods for more complex scenarios
- like handling moved items.</li>
- </ul>
- </div>
- </div>
- </div>
- </div>
- </section>
- </div>
- </div>
- </article>
- </div>
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <div class="ns nt ab ih">
- <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
- href="/tag/android?source=post_page-----729615b3528c--------------------------------">
- <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android</div>
- </a></div>
- <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
- href="/tag/android-app-development?source=post_page-----729615b3528c--------------------------------">
- <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android App Development</div>
- </a></div>
- <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
- href="/tag/android-recyclerview?source=post_page-----729615b3528c--------------------------------">
- <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android Recyclerview</div>
- </a></div>
- <div class="nu ab"><a class="nv ay am ao" rel="noopener follow"
- href="/tag/android-diffutil?source=post_page-----729615b3528c--------------------------------">
- <div class="nw ed cx nx fa ny nz bf b bg z bk oa">Android Diffutil</div>
- </a></div>
- </div>
- </div>
- </div>
- <div class="l"></div>
- <footer class="ob oc od oe of ab q og oh c">
- <div class="l ae">
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <div class="ab cp oi">
- <div class="ab q jq">
- <div class="oj l"><span class="l ok ol om e d">
- <div class="ab q jq jr">
- <div class="pw-multi-vote-icon ed js jt ju jv">
- <div class="">
- <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg xmlns="http://www.w3.org/2000/svg"
- width="24" height="24" viewBox="0 0 24 24" aria-label="clap">
- <path fill-rule="evenodd"
- d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
- clip-rule="evenodd"></path>
- <path fill-rule="evenodd"
- d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
- clip-rule="evenodd"></path>
- </svg></div>
- </div>
- </div>
- <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
- <p class="bf b dy z dx"><span class="jx">--</span></p>
- </div>
- </div>
- </span><span class="l h g f on oo">
- <div class="ab q jq jr">
- <div class="pw-multi-vote-icon ed js jt ju jv">
- <div class="">
- <div class="jw jx jy jz ka kb kc am kd ke kf jv"><svg xmlns="http://www.w3.org/2000/svg"
- width="24" height="24" viewBox="0 0 24 24" aria-label="clap">
- <path fill-rule="evenodd"
- d="M11.37.828 12 3.282l.63-2.454zM15.421 1.84l-1.185-.388-.338 2.5zM9.757 1.452l-1.184.389 1.523 2.112zM20.253 11.84 17.75 7.438c-.238-.353-.57-.584-.93-.643a.96.96 0 0 0-.753.183 1.13 1.13 0 0 0-.443.695c.014.019.03.033.044.053l2.352 4.138c1.614 2.95 1.1 5.771-1.525 8.395a7 7 0 0 1-.454.415c.997-.13 1.927-.61 2.773-1.457 2.705-2.704 2.517-5.585 1.438-7.377M12.066 9.01c-.129-.687.08-1.299.573-1.773l-2.062-2.063a1.123 1.123 0 0 0-1.555 0 1.1 1.1 0 0 0-.273.521z"
- clip-rule="evenodd"></path>
- <path fill-rule="evenodd"
- d="M14.741 8.309c-.18-.267-.446-.455-.728-.502a.67.67 0 0 0-.533.127c-.146.113-.59.458-.199 1.296l1.184 2.503a.448.448 0 0 1-.236.755.445.445 0 0 1-.483-.248L7.614 6.106A.816.816 0 1 0 6.459 7.26l3.643 3.644a.446.446 0 1 1-.631.63L5.83 7.896l-1.03-1.03a.82.82 0 0 0-1.395.577.81.81 0 0 0 .24.576l1.027 1.028 3.643 3.643a.444.444 0 0 1-.144.728.44.44 0 0 1-.486-.098l-3.64-3.64a.82.82 0 0 0-1.335.263.81.81 0 0 0 .178.89l1.535 1.534 2.287 2.288a.445.445 0 0 1-.63.63l-2.287-2.288a.813.813 0 0 0-1.393.578c0 .216.086.424.238.577l4.403 4.403c2.79 2.79 5.495 4.119 8.681.931 2.269-2.271 2.708-4.588 1.342-7.086z"
- clip-rule="evenodd"></path>
- </svg></div>
- </div>
- </div>
- <div class="pw-multi-vote-count l kg kh ki kj kk kl km">
- <p class="bf b dy z dx"><span class="jx">--</span></p>
- </div>
- </div>
- </span></div>
- <div class="bq ab">
- <div>
- <div class="bm" aria-hidden="false"><button class="ao jw kn ko ab q ee kp kq"
- aria-label="responses"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"
- viewBox="0 0 24 24" class="kr">
- <path
- d="M18.006 16.803c1.533-1.456 2.234-3.325 2.234-5.321C20.24 7.357 16.709 4 12.191 4S4 7.357 4 11.482c0 4.126 3.674 7.482 8.191 7.482.817 0 1.622-.111 2.393-.327.231.2.48.391.744.559 1.06.693 2.203 1.044 3.399 1.044.224-.008.4-.112.486-.287a.49.49 0 0 0-.042-.518c-.495-.67-.845-1.364-1.04-2.057a4 4 0 0 1-.125-.598zm-3.122 1.055-.067-.223-.315.096a8 8 0 0 1-2.311.338c-4.023 0-7.292-2.955-7.292-6.587 0-3.633 3.269-6.588 7.292-6.588 4.014 0 7.112 2.958 7.112 6.593 0 1.794-.608 3.469-2.027 4.72l-.195.168v.255c0 .056 0 .151.016.295.025.231.081.478.154.733.154.558.398 1.117.722 1.659a5.3 5.3 0 0 1-2.165-.845c-.276-.176-.714-.383-.941-.59z">
- </path>
- </svg></button></div>
- </div>
- </div>
- </div>
- <div class="ab q">
- <div class="op l ie">
- <div>
- <div class="bm" aria-hidden="false"><button aria-controls="addToCatalogBookmarkButton"
- aria-expanded="false" aria-label="Add to list bookmark button"
- data-testid="footerBookmarkButton" class="af ee ah ai aj ak al kt an ao ap ib ku kv kw"
- disabled=""><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24" class="av">
- <path fill="#000"
- d="M17.5 1.25a.5.5 0 0 1 1 0v2.5H21a.5.5 0 0 1 0 1h-2.5v2.5a.5.5 0 0 1-1 0v-2.5H15a.5.5 0 0 1 0-1h2.5zm-11 4.5a1 1 0 0 1 1-1H11a.5.5 0 0 0 0-1H7.5a2 2 0 0 0-2 2v14a.5.5 0 0 0 .8.4l5.7-4.4 5.7 4.4a.5.5 0 0 0 .8-.4v-8.5a.5.5 0 0 0-1 0v7.48l-5.2-4a.5.5 0 0 0-.6 0l-5.2 4z">
- </path>
- </svg></button></div>
- </div>
- </div>
- <div class="op l ie">
- <div class="bm" aria-hidden="false" aria-describedby="postFooterSocialMenu"
- aria-labelledby="postFooterSocialMenu">
- <div>
- <div class="bm" aria-hidden="false"><button aria-controls="postFooterSocialMenu"
- aria-expanded="false" aria-label="Share Post" data-testid="footerSocialShareButton"
- class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M15.218 4.931a.4.4 0 0 1-.118.132l.012.006a.45.45 0 0 1-.292.074.5.5 0 0 1-.3-.13l-2.02-2.02v7.07c0 .28-.23.5-.5.5s-.5-.22-.5-.5v-7.04l-2 2a.45.45 0 0 1-.57.04h-.02a.4.4 0 0 1-.16-.3.4.4 0 0 1 .1-.32l2.8-2.8a.5.5 0 0 1 .7 0l2.8 2.79a.42.42 0 0 1 .068.498m-.106.138.008.004v-.01zM16 7.063h1.5a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2h-11c-1.1 0-2-.9-2-2v-10a2 2 0 0 1 2-2H8a.5.5 0 0 1 .35.15.5.5 0 0 1 .15.35.5.5 0 0 1-.15.35.5.5 0 0 1-.35.15H6.4c-.5 0-.9.4-.9.9v10.2a.9.9 0 0 0 .9.9h11.2c.5 0 .9-.4.9-.9v-10.2c0-.5-.4-.9-.9-.9H16a.5.5 0 0 1 0-1"
- clip-rule="evenodd"></path>
- </svg></button></div>
- </div>
- </div>
- </div>
- <div class="bm" aria-hidden="false">
- <div>
- <div class="bm" aria-hidden="false"><button aria-label="More options"
- data-testid="footerStoryOptionsButton"
- class="af ee ah ai aj ak al kt an ao ap ib ld le kq lf"><svg
- xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none"
- viewBox="0 0 24 24">
- <path fill="currentColor" fill-rule="evenodd"
- d="M4.385 12c0 .55.2 1.02.59 1.41.39.4.86.59 1.41.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.02.2-1.41.59-.4.39-.59.86-.59 1.41m5.62 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.42.59s1.02-.2 1.41-.59c.4-.39.59-.86.59-1.41s-.2-1.02-.59-1.41a1.93 1.93 0 0 0-1.41-.59c-.55 0-1.03.2-1.42.59s-.58.86-.58 1.41m5.6 0c0 .55.2 1.02.58 1.41.4.4.87.59 1.43.59s1.03-.2 1.42-.59.58-.86.58-1.41-.2-1.02-.58-1.41a1.93 1.93 0 0 0-1.42-.59c-.56 0-1.04.2-1.43.59s-.58.86-.58 1.41"
- clip-rule="evenodd"></path>
- </svg></button></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </footer>
- <div class="oq l">
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <div class="ab or os ot ig if">
- <div class="ou ov ow ox oy oz pa pb pc pd ab cp">
- <div class="h k"><a tabindex="0" rel="noopener follow"
- href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
- <div class="l ed"><img alt="Sandeep Kella" class="l ep by hn hm cx"
- src="https://miro.medium.com/v2/resize:fill:96:96/1*m4ij-Lr2ZViGgYmypjtQ9A.png" width="48"
- height="48" loading="lazy" />
- <div class="el by l hn hm em n ay pe"></div>
- </div>
- </a></div>
- <div class="j i d"><a tabindex="0" rel="noopener follow"
- href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
- <div class="l ed"><img alt="Sandeep Kella" class="l ep by pf pg cx"
- src="https://miro.medium.com/v2/resize:fill:128:128/1*m4ij-Lr2ZViGgYmypjtQ9A.png" width="64"
- height="64" loading="lazy" />
- <div class="el by l pf pg em n ay pe"></div>
- </div>
- </a></div>
- <div class="j i d ph ie">
- <div class="ab"><button
- class="bf b bg z pi nw pj pk pl pm pn po pp pq pr ps pt pu pv pw px ep bm py pz">Follow</button>
- </div>
- </div>
- </div>
- <div class="ab co qa">
- <div class="qb qc qd qe qf l"><a class="af ag ah aj ak al am an ao ap aq ar as at ab q"
- rel="noopener follow"
- href="/@sandeepkella23?source=post_page---post_author_info--729615b3528c--------------------------------">
- <h2 class="pw-author-name bf qh qi qj qk ql qm qn mf qo qp mj qq qr mn qs qt bk"><span
- class="fj qg">Written by <!-- -->Sandeep Kella</span></h2>
- </a>
- <div class="nu ab hl">
- <div class="l ie"><span class="pw-follower-count bf b bg z dx"><a
- class="af ag ah ai aj ak al am an ao ap aq ar hw" rel="noopener follow"
- href="/@sandeepkella23/followers?source=post_page---post_author_info--729615b3528c--------------------------------">2K
- Followers</a></span></div>
- <div class="bf b bg z dx ab qu"><span class="hx l" aria-hidden="true"><span
- class="bf b bg z dx">·</span></span><a class="af ag ah ai aj ak al am an ao ap aq ar hw"
- rel="noopener follow"
- href="/@sandeepkella23/following?source=post_page---post_author_info--729615b3528c--------------------------------">31
- Following</a></div>
- </div>
- <div class="qv l">
- <p class="bf b bg z bk"><span class="fj">Android dev by day, tech writer by night. Breaking down
- code so even my cat could understand it. Join me on Medium for fun, geeky, and practical
- Android tips!</span></p>
- </div>
- </div>
- </div>
- <div class="h k">
- <div class="ab"><button
- class="bf b bg z pi nw pj pk pl pm pn po pp pq pr ps pt pu pv pw px ep bm py pz">Follow</button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="qw l">
- <div class="qx bh r oq"></div>
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <div class="ab q cp">
- <h2 class="bf qh qy qz ra rb rc rd re rf rg rh ri rj rk rl rm bk">No responses yet</h2>
- <div class="ab rn">
- <div>
- <div class="bm" aria-hidden="false"><a class="ro rp"
- href="https://policy.medium.com/medium-rules-30e5502c4eb4?source=post_page---post_responses--729615b3528c--------------------------------"
- rel="noopener follow" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" width="25"
- height="25" viewBox="0 0 25 25">
- <path fill-rule="evenodd"
- d="M11.987 5.036a.754.754 0 0 1 .914-.01c.972.721 1.767 1.218 2.6 1.543.828.322 1.719.485 2.887.505a.755.755 0 0 1 .741.757c-.018 3.623-.43 6.256-1.449 8.21-1.034 1.984-2.662 3.209-4.966 4.083a.75.75 0 0 1-.537-.003c-2.243-.874-3.858-2.095-4.897-4.074-1.024-1.951-1.457-4.583-1.476-8.216a.755.755 0 0 1 .741-.757c1.195-.02 2.1-.182 2.923-.503.827-.322 1.6-.815 2.519-1.535m.468.903c-.897.69-1.717 1.21-2.623 1.564-.898.35-1.856.527-3.026.565.037 3.45.469 5.817 1.36 7.515.884 1.684 2.25 2.762 4.284 3.571 2.092-.81 3.465-1.89 4.344-3.575.886-1.698 1.299-4.065 1.334-7.512-1.149-.039-2.091-.217-2.99-.567-.906-.353-1.745-.873-2.683-1.561m-.009 9.155a2.672 2.672 0 1 0 0-5.344 2.672 2.672 0 0 0 0 5.344m0 1a3.672 3.672 0 1 0 0-7.344 3.672 3.672 0 0 0 0 7.344m-1.813-3.777.525-.526.916.917 1.623-1.625.526.526-2.149 2.152z"
- clip-rule="evenodd"></path>
- </svg></a></div>
- </div>
- </div>
- </div>
- <div class="rq rr rs rt ru l"></div>
- </div>
- </div>
- </div>
- <div class="rv rw rx ry rz l bx">
- <div class="h k j">
- <div class="qx bh sa sb"></div>
- <div class="ab cb">
- <div class="ci bh ev ew ex ey">
- <div class="sc ab jq ih">
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://help.medium.com/hc/en-us?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Help</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://medium.statuspage.io/?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Status</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
- href="/about?autoplay=1&source=post_page-----729615b3528c--------------------------------">
- <p class="bf b dy z dx">About</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
- href="/jobs-at-medium/work-at-medium-959d1a85284e?source=post_page-----729615b3528c--------------------------------">
- <p class="bf b dy z dx">Careers</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="pressinquiries@medium.com?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Press</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://blog.medium.com/?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Blog</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://policy.medium.com/medium-privacy-policy-f03bf92035c9?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Privacy</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://policy.medium.com/medium-terms-of-service-9db0094a1e0f?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Terms</p>
- </a></div>
- <div class="sd se l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at"
- href="https://speechify.com/medium?source=post_page-----729615b3528c--------------------------------"
- rel="noopener follow">
- <p class="bf b dy z dx">Text to speech</p>
- </a></div>
- <div class="sd l"><a class="af ag ah ai aj ak al am an ao ap aq ar as at" rel="noopener follow"
- href="/business?source=post_page-----729615b3528c--------------------------------">
- <p class="bf b dy z dx">Teams</p>
- </a></div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <script>window.__BUILD_ID__ = "main-20250122-110459-713feb26b3"</script>
- <script>window.__GRAPHQL_URI__ = "https://medium.com/_/graphql"</script>
- <script>window.__PRELOADED_STATE__ = { "algolia": { "queries": {} }, "cache": { "experimentGroupSet": true, "reason": "User is logged in", "group": "disabled", "tags": ["group-edgeCachePosts", "post-729615b3528c", "user-709acf7c07e3"], "serverVariantState": "", "middlewareEnabled": true, "cacheStatus": "DYNAMIC", "shouldUseCache": false, "vary": [], "lohpSummerUpsellEnabled": false, "pubFeaturingPostPageLabelEnabled": false }, "client": { "hydrated": false, "isUs": false, "isNativeMedium": false, "isSafariMobile": false, "isSafari": false, "isFirefox": false, "routingEntity": { "type": "DEFAULT", "explicit": false }, "viewerIsBot": false }, "debug": { "requestId": "2bf990f9-21a9-41b7-99e5-111501d0348e", "requestTag": "", "hybridDevServices": [], "originalSpanCarrier": { "traceparent": "00-b1c05d7d4732f54db8d24137038d745c-c41bcb6b6079598a-01" } }, "multiVote": { "clapsPerPost": {} }, "navigation": { "branch": { "show": null, "hasRendered": null, "blockedByCTA": false }, "hideGoogleOneTap": false, "hasRenderedAlternateUserBanner": null, "currentLocation": "https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "host": "medium.com", "hostname": "medium.com", "referrer": "", "hasSetReferrer": false, "susiModal": { "step": null, "operation": "register" }, "postRead": false, "partnerProgram": { "selectedCountryCode": null } }, "config": { "nodeEnv": "production", "version": "main-20250122-110459-713feb26b3", "target": "production", "productName": "Medium", "publicUrl": "https:\u002F\u002Fcdn-client.medium.com\u002Flite", "authDomain": "medium.com", "authGoogleClientId": "216296035834-k1k6qe060s2tp2a2jam4ljdcms00sttg.apps.googleusercontent.com", "favicon": "production", "glyphUrl": "https:\u002F\u002Fglyph.medium.com", "branchKey": "key_live_ofxXr2qTrrU9NqURK8ZwEhknBxiI6KBm", "algolia": { "appId": "MQ57UUUQZ2", "apiKeySearch": "394474ced050e3911ae2249ecc774921", "indexPrefix": "medium_", "host": "-dsn.algolia.net" }, "recaptchaKey": "6Lfc37IUAAAAAKGGtC6rLS13R1Hrw_BqADfS1LRk", "recaptcha3Key": "6Lf8R9wUAAAAABMI_85Wb8melS7Zj6ziuf99Yot5", "recaptchaEnterpriseKeyId": "6Le-uGgpAAAAAPprRaokM8AKthQ9KNGdoxaGUvVp", "datadog": { "applicationId": "6702d87d-a7e0-42fe-bbcb-95b469547ea0", "clientToken": "pub853ea8d17ad6821d9f8f11861d23dfed", "rumToken": "pubf9cc52896502b9413b68ba36fc0c7162", "context": { "deployment": { "target": "production", "tag": "main-20250122-110459-713feb26b3", "commit": "713feb26b3d9571f5ace87eaf9daaf039442f04d" } }, "datacenter": "us" }, "googleAnalyticsCode": "G-7JY7T788PK", "googlePay": { "apiVersion": "2", "apiVersionMinor": "0", "merchantId": "BCR2DN6TV7EMTGBM", "merchantName": "Medium", "instanceMerchantId": "13685562959212738550" }, "applePay": { "version": 3 }, "signInWallCustomDomainCollectionIds": ["3a8144eabfe3", "336d898217ee", "61061eb0c96b", "138adf9c44c", "819cc2aaeee0"], "mediumMastodonDomainName": "me.dm", "mediumOwnedAndOperatedCollectionIds": ["8a9336e5bb4", "b7e45b22fec3", "193b68bd4fba", "8d6b8a439e32", "54c98c43354d", "3f6ecf56618", "d944778ce714", "92d2092dc598", "ae2a65f35510", "1285ba81cada", "544c7006046e", "fc8964313712", "40187e704f1c", "88d9857e584e", "7b6769f2748b", "bcc38c8f6edf", "cef6983b292", "cb8577c9149e", "444d13b52878", "713d7dbc99b0", "ef8e90590e66", "191186aaafa0", "55760f21cdc5", "9dc80918cc93", "bdc4052bbdba", "8ccfed20cbb2"], "tierOneDomains": ["medium.com", "thebolditalic.com", "arcdigital.media", "towardsdatascience.com", "uxdesign.cc", "codeburst.io", "psiloveyou.xyz", "writingcooperative.com", "entrepreneurshandbook.co", "prototypr.io", "betterhumans.coach.me", "theascent.pub"], "topicsToFollow": ["d61cf867d93f", "8a146bc21b28", "1eca0103fff3", "4d562ee63426", "aef1078a3ef5", "e15e46793f8d", "6158eb913466", "55f1c20aba7a", "3d18b94f6858", "4861fee224fd", "63c6f1f93ee", "1d98b3a9a871", "decb52b64abf", "ae5d4995e225", "830cded25262"], "topicToTagMappings": { "accessibility": "accessibility", "addiction": "addiction", "android-development": "android-development", "art": "art", "artificial-intelligence": "artificial-intelligence", "astrology": "astrology", "basic-income": "basic-income", "beauty": "beauty", "biotech": "biotech", "blockchain": "blockchain", "books": "books", "business": "business", "cannabis": "cannabis", "cities": "cities", "climate-change": "climate-change", "comics": "comics", "coronavirus": "coronavirus", "creativity": "creativity", "cryptocurrency": "cryptocurrency", "culture": "culture", "cybersecurity": "cybersecurity", "data-science": "data-science", "design": "design", "digital-life": "digital-life", "disability": "disability", "economy": "economy", "education": "education", "equality": "equality", "family": "family", "feminism": "feminism", "fiction": "fiction", "film": "film", "fitness": "fitness", "food": "food", "freelancing": "freelancing", "future": "future", "gadgets": "gadgets", "gaming": "gaming", "gun-control": "gun-control", "health": "health", "history": "history", "humor": "humor", "immigration": "immigration", "ios-development": "ios-development", "javascript": "javascript", "justice": "justice", "language": "language", "leadership": "leadership", "lgbtqia": "lgbtqia", "lifestyle": "lifestyle", "machine-learning": "machine-learning", "makers": "makers", "marketing": "marketing", "math": "math", "media": "media", "mental-health": "mental-health", "mindfulness": "mindfulness", "money": "money", "music": "music", "neuroscience": "neuroscience", "nonfiction": "nonfiction", "outdoors": "outdoors", "parenting": "parenting", "pets": "pets", "philosophy": "philosophy", "photography": "photography", "podcasts": "podcast", "poetry": "poetry", "politics": "politics", "privacy": "privacy", "product-management": "product-management", "productivity": "productivity", "programming": "programming", "psychedelics": "psychedelics", "psychology": "psychology", "race": "race", "relationships": "relationships", "religion": "religion", "remote-work": "remote-work", "san-francisco": "san-francisco", "science": "science", "self": "self", "self-driving-cars": "self-driving-cars", "sexuality": "sexuality", "social-media": "social-media", "society": "society", "software-engineering": "software-engineering", "space": "space", "spirituality": "spirituality", "sports": "sports", "startups": "startup", "style": "style", "technology": "technology", "transportation": "transportation", "travel": "travel", "true-crime": "true-crime", "tv": "tv", "ux": "ux", "venture-capital": "venture-capital", "visual-design": "visual-design", "work": "work", "world": "world", "writing": "writing" }, "defaultImages": { "avatar": { "imageId": "1*dmbNkD5D-u45r44go_cf0g.png", "height": 150, "width": 150 }, "orgLogo": { "imageId": "7*V1_7XP4snlmqrc_0Njontw.png", "height": 110, "width": 500 }, "postLogo": { "imageId": "bd978bb536350a710e8efb012513429cabdc4c28700604261aeda246d0f980b7", "height": 810, "width": 1440 }, "postPreviewImage": { "imageId": "1*hn4v1tCaJy7cWMyb0bpNpQ.png", "height": 386, "width": 579 } }, "collectionStructuredData": { "8d6b8a439e32": { "name": "Elemental", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F980\u002F1*9ygdqoKprhwuTVKUM0DLPA@2x.png", "width": 980, "height": 159 } } }, "3f6ecf56618": { "name": "Forge", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F596\u002F1*uULpIlImcO5TDuBZ6lm7Lg@2x.png", "width": 596, "height": 183 } } }, "ae2a65f35510": { "name": "GEN", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F264\u002F1*RdVZMdvfV3YiZTw6mX7yWA.png", "width": 264, "height": 140 } } }, "88d9857e584e": { "name": "LEVEL", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*JqYMhNX6KNNb2UlqGqO2WQ.png", "width": 540, "height": 108 } } }, "7b6769f2748b": { "name": "Marker", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fcdn-images-1.medium.com\u002Fmax\u002F383\u002F1*haCUs0wF6TgOOvfoY-jEoQ@2x.png", "width": 383, "height": 92 } } }, "444d13b52878": { "name": "OneZero", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*cw32fIqCbRWzwJaoQw6BUg.png", "width": 540, "height": 123 } } }, "8ccfed20cbb2": { "name": "Zora", "data": { "@type": "NewsMediaOrganization", "ethicsPolicy": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Farticles\u002F360043290473", "logo": { "@type": "ImageObject", "url": "https:\u002F\u002Fmiro.medium.com\u002Fmax\u002F540\u002F1*tZUQqRcCCZDXjjiZ4bDvgQ.png", "width": 540, "height": 106 } } } }, "embeddedPostIds": { "coronavirus": "cd3010f9d81f" }, "sharedCdcMessaging": { "COVID_APPLICABLE_TAG_SLUGS": [], "COVID_APPLICABLE_TOPIC_NAMES": [], "COVID_APPLICABLE_TOPIC_NAMES_FOR_TOPIC_PAGE": [], "COVID_MESSAGES": { "tierA": { "text": "For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 66, "end": 73, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "tierB": { "text": "Anyone can publish on Medium per our Policies, but we don’t fact-check every story. For more info about the coronavirus, see cdc.gov.", "markups": [{ "start": 37, "end": 45, "href": "https:\u002F\u002Fhelp.medium.com\u002Fhc\u002Fen-us\u002Fcategories\u002F201931128-Policies-Safety" }, { "start": 125, "end": 132, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "paywall": { "text": "This article has been made free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 56, "end": 70, "href": "https:\u002F\u002Fmedium.com\u002Fmembership" }, { "start": 138, "end": 145, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] }, "unbound": { "text": "This article is free for everyone, thanks to Medium Members. For more information on the novel coronavirus and Covid-19, visit cdc.gov.", "markups": [{ "start": 45, "end": 59, "href": "https:\u002F\u002Fmedium.com\u002Fmembership" }, { "start": 127, "end": 134, "href": "https:\u002F\u002Fwww.cdc.gov\u002Fcoronavirus\u002F2019-nCoV" }] } }, "COVID_BANNER_POST_ID_OVERRIDE_WHITELIST": ["3b31a67bff4a"] }, "sharedVoteMessaging": { "TAGS": ["politics", "election-2020", "government", "us-politics", "election", "2020-presidential-race", "trump", "donald-trump", "democrats", "republicans", "congress", "republican-party", "democratic-party", "biden", "joe-biden", "maga"], "TOPICS": ["politics", "election"], "MESSAGE": { "text": "Find out more about the U.S. election results here.", "markups": [{ "start": 46, "end": 50, "href": "https:\u002F\u002Fcookpolitical.com\u002F2020-national-popular-vote-tracker" }] }, "EXCLUDE_POSTS": ["397ef29e3ca5"] }, "embedPostRules": [], "recircOptions": { "v1": { "limit": 3 }, "v2": { "limit": 8 } }, "braintreeClientKey": "production_zjkj96jm_m56f8fqpf7ngnrd4", "braintree": { "enabled": true, "merchantId": "m56f8fqpf7ngnrd4", "merchantAccountId": { "usd": "AMediumCorporation_instant", "eur": "amediumcorporation_EUR", "cad": "amediumcorporation_CAD" }, "publicKey": "ds2nn34bg2z7j5gd", "braintreeEnvironment": "production", "dashboardUrl": "https:\u002F\u002Fwww.braintreegateway.com\u002Fmerchants", "gracePeriodDurationInDays": 14, "mediumMembershipPlanId": { "monthly": "ce105f8c57a3", "monthlyV2": "e8a5e126-792b-4ee6-8fba-d574c1b02fc5", "monthlyWithTrial": "d5ee3dbe3db8", "monthlyPremium": "fa741a9b47a2", "yearly": "a40ad4a43185", "yearlyV2": "3815d7d6-b8ca-4224-9b8c-182f9047866e", "yearlyStaff": "d74fb811198a", "yearlyWithTrial": "b3bc7350e5c7", "yearlyPremium": "e21bd2c12166", "monthlyOneYearFree": "e6c0637a-2bad-4171-ab4f-3c268633d83c", "monthly25PercentOffFirstYear": "235ecc62-0cdb-49ae-9378-726cd21c504b", "monthly20PercentOffFirstYear": "ba518864-9c13-4a99-91ca-411bf0cac756", "monthly15PercentOffFirstYear": "594c029b-9f89-43d5-88f8-8173af4e070e", "monthly10PercentOffFirstYear": "c6c7bc9a-40f2-4b51-8126-e28511d5bdb0", "monthlyForStudents": "629ebe51-da7d-41fd-8293-34cd2f2030a8", "yearlyOneYearFree": "78ba7be9-0d9f-4ece-aa3e-b54b826f2bf1", "yearly25PercentOffFirstYear": "2dbb010d-bb8f-4eeb-ad5c-a08509f42d34", "yearly20PercentOffFirstYear": "47565488-435b-47f8-bf93-40d5fbe0ebc8", "yearly15PercentOffFirstYear": "8259809b-0881-47d9-acf7-6c001c7f720f", "yearly10PercentOffFirstYear": "9dd694fb-96e1-472c-8d9e-3c868d5c1506", "yearlyForStudents": "e29345ef-ab1c-4234-95c5-70e50fe6bc23", "monthlyCad": "p52orjkaceei", "yearlyCad": "h4q9g2up9ktt" }, "braintreeDiscountId": { "oneMonthFree": "MONTHS_FREE_01", "threeMonthsFree": "MONTHS_FREE_03", "sixMonthsFree": "MONTHS_FREE_06", "fiftyPercentOffOneYear": "FIFTY_PERCENT_OFF_ONE_YEAR" }, "3DSecureVersion": "2", "defaultCurrency": "usd", "providerPlanIdCurrency": { "4ycw": "usd", "rz3b": "usd", "3kqm": "usd", "jzw6": "usd", "c2q2": "usd", "nnsw": "usd", "q8qw": "usd", "d9y6": "usd", "fx7w": "cad", "nwf2": "cad" } }, "paypalClientId": "AXj1G4fotC2GE8KzWX9mSxCH1wmPE3nJglf4Z2ig_amnhvlMVX87otaq58niAg9iuLktVNF_1WCMnN7v", "paypal": { "host": "https:\u002F\u002Fapi.paypal.com:443", "clientMode": "production", "serverMode": "live", "webhookId": "4G466076A0294510S", "monthlyPlan": { "planId": "P-9WR0658853113943TMU5FDQA", "name": "Medium Membership (Monthly) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "yearlyPlan": { "planId": "P-7N8963881P8875835MU5JOPQ", "name": "Medium Membership (Annual) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "oneYearGift": { "name": "Medium Membership (1 Year, Digital Gift Code)", "description": "Unlimited access to the best and brightest stories on Medium. Gift codes can be redeemed at medium.com\u002Fredeem.", "price": "50.00", "currency": "USD", "sku": "membership-gift-1-yr" }, "oldMonthlyPlan": { "planId": "P-96U02458LM656772MJZUVH2Y", "name": "Medium Membership (Monthly)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "oldYearlyPlan": { "planId": "P-59P80963JF186412JJZU3SMI", "name": "Medium Membership (Annual)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "monthlyPlanWithTrial": { "planId": "P-66C21969LR178604GJPVKUKY", "name": "Medium Membership (Monthly) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "yearlyPlanWithTrial": { "planId": "P-6XW32684EX226940VKCT2MFA", "name": "Medium Membership (Annual) with setup fee", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "oldMonthlyPlanNoSetupFee": { "planId": "P-4N046520HR188054PCJC7LJI", "name": "Medium Membership (Monthly)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed monthly." }, "oldYearlyPlanNoSetupFee": { "planId": "P-7A4913502Y5181304CJEJMXQ", "name": "Medium Membership (Annual)", "description": "Unlimited access to the best and brightest stories on Medium. Membership billed annually." }, "sdkUrl": "https:\u002F\u002Fwww.paypal.com\u002Fsdk\u002Fjs" }, "stripePublishableKey": "pk_live_7FReX44VnNIInZwrIIx6ghjl", "log": { "json": true, "level": "info" }, "imageUploadMaxSizeMb": 25, "staffPicks": { "title": "Staff Picks", "catalogId": "c7bc6e1ee00f" } }, "session": { "xsrf": "07cd857f2920" } }</script>
- <script>window.__APOLLO_STATE__ = { "ROOT_QUERY": { "__typename": "Query", "variantFlags": [{ "__typename": "VariantFlag", "name": "enable_author_cards", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_response_markup", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_friend_links_creation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_dynamic_paywall_aspiriational", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pill_based_home_feed", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lo_homepage", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_sprig", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "price_smoke_test_monthly", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "enable_google_one_tap", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tick_landing_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "rex_generator_max_candidates", "valueType": { "__typename": "VariantFlagNumber", "value": 1000 } }, { "__typename": "VariantFlag", "name": "allow_access", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_hybrid_ranking_model", "valueType": { "__typename": "VariantFlagString", "value": "experiment" } }, { "__typename": "VariantFlag", "name": "enable_premium_tier", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_two_hour_refresh", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "browsable_stream_config_bucket", "valueType": { "__typename": "VariantFlagString", "value": "curated-topics" } }, { "__typename": "VariantFlag", "name": "disable_partner_program_enrollment", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_google_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_new_push_notification_endpoint", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_image_sharer", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_import", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_marketing_emails", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_remove_twitter_onboarding_step", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tag_recs", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "price_smoke_test_yearly", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "android_enable_topic_portals", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_reading_history", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "limit_user_follows", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_integration", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rex_aggregator_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_home_post_menu", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_lists_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_publish_permission_check", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_switch_plan_premium_tier", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tribute_landing_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "num_post_bottom_responses_to_show", "valueType": { "__typename": "VariantFlagString", "value": "3" } }, { "__typename": "VariantFlag", "name": "enable_abandoned_paywall_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "allow_signup", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_bg_post_post", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_avatar_upload", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pub_featuring_stats", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_see_pronouns", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "reader_fair_distribution_non_qp", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_abandoned_cart_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_winback_promotion_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "goliath_externalsearch_enable_comment_deindexation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "signin_services", "valueType": { "__typename": "VariantFlagString", "value": "twitter,facebook,google,email,google-fastidv,google-one-tap,apple" } }, { "__typename": "VariantFlag", "name": "enable_intrinsic_automatic_actions", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ranker_v10", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "android_rating_prompt_stories_read_threshold", "valueType": { "__typename": "VariantFlagNumber", "value": 2 } }, { "__typename": "VariantFlag", "name": "enable_deprecate_legacy_providers_v3", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_apple_pay", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_client", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_plans_page_payment_form", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_sharer_validate_post_share_key", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_offline_reading", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_diversification_rex", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "mobile_custom_app_icon", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "available_monthly_premium_plan", "valueType": { "__typename": "VariantFlagString", "value": "12a660186432" } }, { "__typename": "VariantFlag", "name": "enable_deviant_get_variant_flag_from_medium2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "glyph_font_set", "valueType": { "__typename": "VariantFlagString", "value": "m2-unbound-source-serif-pro" } }, { "__typename": "VariantFlag", "name": "enable_android_dynamic_aspirational_paywall", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pp_country_expansion", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_miro_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_easy_resubscribe", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_server_upstream_deadlines", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_c", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_sms_verification_for_publish", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_verifications_service", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_members_only_audio", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "available_monthly_plan", "valueType": { "__typename": "VariantFlagString", "value": "60e220181034" } }, { "__typename": "VariantFlag", "name": "can_receive_tips_v0", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_premium_tier_badge", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_friend_links_postpage_banners", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "coronavirus_topic_recirc", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ml_rank_rex_anno", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_sharer_create_post_share_key", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_iceland_nux", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_friend_links_postpage_banners", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_cancellation_discount_v1_gate", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_archive_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_medium2_kbfd", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_new_manage_membership_flow", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_verified_author", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_auto_follow_on_subscribe", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_creator_welcome_email", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_entities_to_follow_v2", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_publication_hierarchy_web", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recaptcha_enterprise", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_display_paywall_after_onboarding", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "skip_fs_cache_user_vals", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_author_cards_byline", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recirc_model", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_apple_sign_in", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_footer_app_buttons", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_first_story", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_seamless_social_sharing", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_moc_load_processor_all_recs_surfaces", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_starspace", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_lock_responses", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_trial_membership", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_group_gifting", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_update_explore_wtf", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_syntax_highlight", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_recommended_publishers_query", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_rito_upstream_deadlines", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses_input", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_post_bottom_responses_native", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tipping_v0_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_friend_links_creation", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pub_featuring", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "redefined_top_posts", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_app_flirty_thirty", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_updated_pub_recs_ui", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_offline_reading", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "android_enable_editor_new_publishing_flow", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_boost_nia_v01", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_pp_v4", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_in_app_free_trial", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_aurora_pub_follower_page", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_automod", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_google_pay", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_iceland_forced_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_autorefresh", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_homepage", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_new_stripe_customers", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "textshots_userid", "valueType": { "__typename": "VariantFlagString", "value": "" } }, { "__typename": "VariantFlag", "name": "allow_test_auth", "valueType": { "__typename": "VariantFlagString", "value": "disallow" } }, { "__typename": "VariantFlag", "name": "available_annual_plan", "valueType": { "__typename": "VariantFlagString", "value": "2c754bcc2995" } }, { "__typename": "VariantFlag", "name": "enable_pre_pp_v4", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_enable_verified_book_author", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_conversion_model_v2", "valueType": { "__typename": "VariantFlagString", "value": "group_2" } }, { "__typename": "VariantFlag", "name": "enable_trust_service_recaptcha", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_branch_io", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_speechify_widget", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_eventstats_event_processing", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_simplified_digest_v2_b", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_susi_redesign_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "signup_services", "valueType": { "__typename": "VariantFlagString", "value": "twitter,facebook,google,email,google-fastidv,google-one-tap,apple" } }, { "__typename": "VariantFlag", "name": "enable_apple_webhook", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_tipping_v0_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_update_topic_portals_wtf", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_cache_less_following_feed", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_ios_dynamic_paywall_programming", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_for_members", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "limit_post_referrers", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "onboarding_tags_from_top_views", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_android_dynamic_programming_paywall", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_conversion_ranker_v2", "valueType": { "__typename": "VariantFlagString", "value": "control" } }, { "__typename": "VariantFlag", "name": "enable_speechify_ios", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_susi_redesign_android", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_braintree_paypal", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_mastodon_for_members_username_selection", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "reengagement_notification_duration", "valueType": { "__typename": "VariantFlagNumber", "value": 3 } }, { "__typename": "VariantFlag", "name": "available_annual_premium_plan", "valueType": { "__typename": "VariantFlagString", "value": "4a442ace1476" } }, { "__typename": "VariantFlag", "name": "enable_configure_pronouns", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_legacy_feed_in_iceland", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_newsletter_lo_flow_custom_domains", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "ios_social_share_sheet", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "can_send_tips_v0", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_lite_continue_this_thread", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }, { "__typename": "VariantFlag", "name": "enable_maim_the_meter", "valueType": { "__typename": "VariantFlagBoolean", "value": true } }], "viewer": { "__ref": "User:4954827388ef" }, "collectionByDomainOrSlug({\"domainOrSlug\":\"medium.com\"})": null, "postResult({\"id\":\"729615b3528c\"})": { "__ref": "Post:729615b3528c" } }, "UserViewerEdge:userId:4954827388ef-viewerId:4954827388ef": { "__typename": "UserViewerEdge", "id": "userId:4954827388ef-viewerId:4954827388ef", "createdAt": 1691393307564 }, "User:4954827388ef": { "__typename": "User", "id": "4954827388ef", "allowEmailAddressSharingEditorWriter": false, "dismissableFlags": [], "emailObfuscated": "gu••••••••••@163.com", "geolocation": { "__typename": "Geolocation", "country": "US" }, "hasGroupGiftingEnabled": false, "hasPastMemberships": false, "hasSubdomain": false, "imageId": "0*tPpe_E0eT2MCh2h2", "isEligibleToImportEmails": false, "isEligibleToViewNewResponses": true, "isMembershipTrialEligible": true, "isSuspended": false, "membership": null, "name": "Guoziyun", "partnerProgramEnrollment": null, "postSubscribeMembershipUpsellShownAt": 0, "styleEditorOnboardingVersionSeen": 0, "twitterScreenName": "", "unverifiedEmail": "", "username": "guoziyun1999", "viewerEdge": { "__ref": "UserViewerEdge:userId:4954827388ef-viewerId:4954827388ef" }, "pronouns": [] }, "LinkedAccounts:709acf7c07e3": { "__typename": "LinkedAccounts", "mastodon": null, "id": "709acf7c07e3" }, "Membership:18aa4934-76db-44ba-9003-0eace9da7ae1": { "__typename": "Membership", "tier": "MEMBER", "id": "18aa4934-76db-44ba-9003-0eace9da7ae1" }, "User:709acf7c07e3": { "__typename": "User", "id": "709acf7c07e3", "linkedAccounts": { "__ref": "LinkedAccounts:709acf7c07e3" }, "isSuspended": false, "name": "Sandeep Kella", "imageId": "1*m4ij-Lr2ZViGgYmypjtQ9A.png", "customDomainState": null, "hasSubdomain": false, "username": "sandeepkella23", "verifications": { "__typename": "VerifiedInfo", "isBookAuthor": false }, "socialStats": { "__typename": "SocialStats", "followerCount": 2098, "followingCount": 17, "collectionFollowingCount": 14 }, "bio": "Android dev by day, tech writer by night. Breaking down code so even my cat could understand it. Join me on Medium for fun, geeky, and practical Android tips!", "membership": { "__ref": "Membership:18aa4934-76db-44ba-9003-0eace9da7ae1" }, "allowNotes": true, "viewerEdge": { "__ref": "UserViewerEdge:userId:709acf7c07e3-viewerId:4954827388ef" }, "twitterScreenName": "" }, "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png": { "__typename": "ImageMetadata", "id": "1*9-tDBevuDRdN2pMUN5GJhg.png", "originalHeight": 565, "originalWidth": 1078, "focusPercentX": null, "focusPercentY": null, "alt": null }, "Paragraph:6ecbd3f52f06_0": { "__typename": "Paragraph", "id": "6ecbd3f52f06_0", "name": "521b", "type": "IMG", "href": null, "layout": "INSET_CENTER", "metadata": { "__ref": "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png" }, "text": "", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_1": { "__typename": "Paragraph", "id": "6ecbd3f52f06_1", "name": "d09a", "type": "H3", "href": null, "layout": null, "metadata": null, "text": "Using DiffUtil.ItemCallback for Efficient RecyclerView Updates", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_2": { "__typename": "Paragraph", "id": "6ecbd3f52f06_2", "name": "384c", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_3": { "__typename": "Paragraph", "id": "6ecbd3f52f06_3", "name": "6332", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Use Case: Imagine you have a RecyclerView displaying a list of tasks. When a user marks a task as complete, you want to update the UI to reflect the change (e.g., strikethrough for completed tasks).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 9, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_4": { "__typename": "Paragraph", "id": "6ecbd3f52f06_4", "name": "dd75", "type": "P", "href": null, "layout": null, "metadata": null, "text": "DiffUtil.ItemCallback Implementation:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 37, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_5": { "__typename": "Paragraph", "id": "6ecbd3f52f06_5", "name": "f5c1", "type": "PRE", "href": null, "layout": null, "metadata": null, "text": "public class TaskAdapter extends RecyclerView.Adapter\u003CTaskViewHolder\u003E {\nprivate List\u003CTask\u003E tasks;\n public TaskAdapter(List\u003CTask\u003E tasks) {\n this.tasks = tasks;\n }\n @Override\n public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n \u002F\u002F ... (inflate view layout for the task)\n return new TaskViewHolder(itemView);\n }\n @Override\n public void onBindViewHolder(TaskViewHolder holder, int position) {\n Task task = tasks.get(position);\n holder.taskTextView.setText(task.getTitle());\n holder.taskCompletedView.setVisibility(task.isCompleted() ? View.VISIBLE : View.GONE);\n }\n @Override\n public int getItemCount() {\n return tasks.size();\n }\n public void updateTasks(List\u003CTask\u003E newTasks) {\n DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new DiffUtil.ItemCallback() {\n @Override\n public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {\n return tasks.get(oldItemPosition).getId() == newTasks.get(newItemPosition).getId();\n }\n @Override\n public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {\n Task oldTask = tasks.get(oldItemPosition);\n Task newTask = newTasks.get(newItemPosition);\n return oldTask.getId() == newTask.getId() &&\n oldTask.getTitle().equals(newTask.getTitle()) &&\n oldTask.isCompleted() == newTask.isCompleted();\n }\n });\n tasks = newTasks;\n diffResult.dispatchUpdatesTo(this);\n }\n}", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": { "__typename": "CodeBlockMetadata", "mode": "AUTO", "lang": "java" }, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_6": { "__typename": "Paragraph", "id": "6ecbd3f52f06_6", "name": "0d5e", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Explanation:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 12, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_7": { "__typename": "Paragraph", "id": "6ecbd3f52f06_7", "name": "8d71", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The TaskAdapter manages a list of Task objects.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 34, "end": 38, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_8": { "__typename": "Paragraph", "id": "6ecbd3f52f06_8", "name": "1627", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The updateTasks method takes a new list of tasks.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_9": { "__typename": "Paragraph", "id": "6ecbd3f52f06_9", "name": "182d", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "We use DiffUtil.calculateDiff to compare the old (tasks) and new (newTasks) lists based on the provided DiffUtil.ItemCallback implementation.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 7, "end": 29, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 50, "end": 55, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 66, "end": 74, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 104, "end": 125, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_10": { "__typename": "Paragraph", "id": "6ecbd3f52f06_10", "name": "f9dc", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "areItemsTheSame: This method checks if two items represent the same underlying data object. Here, we compare task IDs to ensure we're dealing with the same task even if its content changes.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 0, "end": 15, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_11": { "__typename": "Paragraph", "id": "6ecbd3f52f06_11", "name": "2433", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "areContentsTheSame: This method checks if the content of two items has changed. We compare the task ID, title, and completion status to determine if an update is necessary.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 0, "end": 18, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_12": { "__typename": "Paragraph", "id": "6ecbd3f52f06_12", "name": "f7da", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "The DiffUtil.calculateDiff method returns a DiffUtil.DiffResult object containing the minimal set of changes required (insertions, deletions, or changes).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 4, "end": 26, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }, { "__typename": "Markup", "type": "CODE", "start": 44, "end": 63, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_13": { "__typename": "Paragraph", "id": "6ecbd3f52f06_13", "name": "f995", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "We update the adapter’s internal data list to the new list (tasks = newTasks).", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 60, "end": 76, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_14": { "__typename": "Paragraph", "id": "6ecbd3f52f06_14", "name": "5714", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "Finally, we call diffResult.dispatchUpdatesTo(this) which efficiently updates the RecyclerView based on the calculated changes, avoiding unnecessary full view refreshes.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 17, "end": 51, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_15": { "__typename": "Paragraph", "id": "6ecbd3f52f06_15", "name": "6a57", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Benefits:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 9, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_16": { "__typename": "Paragraph", "id": "6ecbd3f52f06_16", "name": "d853", "type": "P", "href": null, "layout": null, "metadata": null, "text": "In this example, DiffUtil helps efficiently update the UI only for tasks that have actually changed (completed or not). This improves performance and provides a smoother user experience.", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_17": { "__typename": "Paragraph", "id": "6ecbd3f52f06_17", "name": "6ef6", "type": "P", "href": null, "layout": null, "metadata": null, "text": "Additional Notes:", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "STRONG", "start": 0, "end": 17, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_18": { "__typename": "Paragraph", "id": "6ecbd3f52f06_18", "name": "de2b", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "You can customize the comparison logic in DiffUtil.ItemCallback based on your data structure and needs.", "hasDropCap": null, "dropCapImage": null, "markups": [{ "__typename": "Markup", "type": "CODE", "start": 42, "end": 63, "href": null, "anchorType": null, "userId": null, "linkMetadata": null }], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "Paragraph:6ecbd3f52f06_19": { "__typename": "Paragraph", "id": "6ecbd3f52f06_19", "name": "90b2", "type": "ULI", "href": null, "layout": null, "metadata": null, "text": "This is a basic example. DiffUtil offers additional methods for more complex scenarios like handling moved items.", "hasDropCap": null, "dropCapImage": null, "markups": [], "codeBlockMetadata": null, "iframe": null, "mixtapeMetadata": null }, "UserViewerEdge:userId:709acf7c07e3-viewerId:4954827388ef": { "__typename": "UserViewerEdge", "id": "userId:709acf7c07e3-viewerId:4954827388ef", "isMuting": false }, "PostViewerEdge:postId:729615b3528c-viewerId:4954827388ef": { "__typename": "PostViewerEdge", "shouldIndexPostForExternalSearch": true, "id": "postId:729615b3528c-viewerId:4954827388ef" }, "Tag:android": { "__typename": "Tag", "id": "android", "displayTitle": "Android", "normalizedTagSlug": "android" }, "Tag:android-app-development": { "__typename": "Tag", "id": "android-app-development", "displayTitle": "Android App Development", "normalizedTagSlug": "android-app-development" }, "Tag:android-recyclerview": { "__typename": "Tag", "id": "android-recyclerview", "displayTitle": "Android Recyclerview", "normalizedTagSlug": "android-recyclerview" }, "Tag:android-diffutil": { "__typename": "Tag", "id": "android-diffutil", "displayTitle": "Android Diffutil", "normalizedTagSlug": "android-diffutil" }, "Post:729615b3528c": { "__typename": "Post", "id": "729615b3528c", "collection": null, "content({\"postMeteringOptions\":{\"referrer\":\"\"}})": { "__typename": "PostContent", "isLockedPreviewOnly": false, "bodyModel": { "__typename": "RichText", "sections": [{ "__typename": "Section", "name": "28d2", "startIndex": 0, "textLayout": null, "imageLayout": null, "backgroundImage": null, "videoLayout": null, "backgroundVideo": null }], "paragraphs": [{ "__ref": "Paragraph:6ecbd3f52f06_0" }, { "__ref": "Paragraph:6ecbd3f52f06_1" }, { "__ref": "Paragraph:6ecbd3f52f06_2" }, { "__ref": "Paragraph:6ecbd3f52f06_3" }, { "__ref": "Paragraph:6ecbd3f52f06_4" }, { "__ref": "Paragraph:6ecbd3f52f06_5" }, { "__ref": "Paragraph:6ecbd3f52f06_6" }, { "__ref": "Paragraph:6ecbd3f52f06_7" }, { "__ref": "Paragraph:6ecbd3f52f06_8" }, { "__ref": "Paragraph:6ecbd3f52f06_9" }, { "__ref": "Paragraph:6ecbd3f52f06_10" }, { "__ref": "Paragraph:6ecbd3f52f06_11" }, { "__ref": "Paragraph:6ecbd3f52f06_12" }, { "__ref": "Paragraph:6ecbd3f52f06_13" }, { "__ref": "Paragraph:6ecbd3f52f06_14" }, { "__ref": "Paragraph:6ecbd3f52f06_15" }, { "__ref": "Paragraph:6ecbd3f52f06_16" }, { "__ref": "Paragraph:6ecbd3f52f06_17" }, { "__ref": "Paragraph:6ecbd3f52f06_18" }, { "__ref": "Paragraph:6ecbd3f52f06_19" }] }, "validatedShareKey": "", "shareKeyCreator": null }, "creator": { "__ref": "User:709acf7c07e3" }, "inResponseToEntityType": null, "isLocked": false, "isMarkedPaywallOnly": false, "lockedSource": "LOCKED_POST_SOURCE_NONE", "mediumUrl": "https:\u002F\u002Fmedium.com\u002F@sandeepkella23\u002Fusing-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "primaryTopic": null, "topics": [{ "__typename": "Topic", "slug": "android-development" }, { "__typename": "Topic", "slug": "ios-development" }, { "__typename": "Topic", "slug": "programming" }], "isPublished": true, "latestPublishedVersion": "6ecbd3f52f06", "visibility": "PUBLIC", "postResponses": { "__typename": "PostResponses", "count": 0 }, "responseDistribution": "NOT_DISTRIBUTED", "clapCount": 0, "allowResponses": true, "isLimitedState": false, "title": "Using DiffUtil.ItemCallback for Efficient RecyclerView Updates", "isSeries": false, "sequence": null, "uniqueSlug": "using-diffutil-itemcallback-for-efficient-recyclerview-updates-729615b3528c", "socialTitle": "", "socialDek": "", "canonicalUrl": "", "metaDescription": "", "latestPublishedAt": 1715817094732, "readingTime": 1.6566037735849055, "previewContent": { "__typename": "PreviewContent", "subtitle": "Here’s an explanation of DiffUtil.ItemCallback with a sample use case and code:" }, "previewImage": { "__ref": "ImageMetadata:1*9-tDBevuDRdN2pMUN5GJhg.png" }, "isShortform": false, "seoTitle": "", "firstPublishedAt": 1715817094732, "updatedAt": 1732619321326, "shortformType": "SHORTFORM_TYPE_LINK", "seoDescription": "", "viewerEdge": { "__ref": "PostViewerEdge:postId:729615b3528c-viewerId:4954827388ef" }, "isSuspended": false, "license": "ALL_RIGHTS_RESERVED", "tags": [{ "__ref": "Tag:android" }, { "__ref": "Tag:android-app-development" }, { "__ref": "Tag:android-recyclerview" }, { "__ref": "Tag:android-diffutil" }], "isNewsletter": false, "statusForCollection": null, "pendingCollection": null, "detectedLanguage": "en", "wordCount": 386, "layerCake": 0, "responsesLocked": false } }</script>
- <script src="https://cdn-client.medium.com/lite/static/js/manifest.1414700e.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/9865.1496d74a.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/main.67cc6133.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/instrumentation.d9108df7.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/reporting.ff22a7a5.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/5049.d1ead72d.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/4436.36c1a067.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/6618.db187378.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/2707.a4e221ac.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/9977.933c1c9a.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/8599.73cb8339.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/5250.0e056565.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/8346.be5bef41.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/2648.26563adf.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/8393.a4ecfb83.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/4863.c36d9f71.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/9779.ab19e975.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/5642.bf6eafcf.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/6546.0da5aa17.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/6834.8aa8d357.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/4492.3e85e9f5.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/839.1c286b32.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/3259.1779fbde.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/7975.60bcefe8.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/144.e73a6d28.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/5794.9e8ff5dd.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/8204.d36bf1b6.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/4391.59acaed3.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/PostPage.MainContent.d97811b2.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/8414.6565ad5f.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/3974.8d3e0217.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/2527.acc94d39.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/PostResponsesContent.f8aff1b9.chunk.js"></script>
- <script src="https://cdn-client.medium.com/lite/static/js/responses.editor.5a11f4da.chunk.js"></script>
- <script>window.main();</script>
- <script defer src="https://static.cloudflareinsights.com/beacon.min.js/vcd15cbe7772f49c399c6a5babf22c1241717689176015"
- integrity="sha512-ZpsOmlRQV6y907TI0dKBHq9Md29nnaEIPlkf84rnaERnq6zvWvPUqr2ft8M1aS28oN72PdrCzSjY4U6VaAw1EQ=="
- data-cf-beacon='{"rayId":"905f928fffe17d8f","serverTiming":{"name":{"cfExtPri":true,"cfL4":true,"cfSpeedBrain":true,"cfCacheStatus":true}},"version":"2025.1.0","token":"0b5f665943484354a59c39c6833f7078"}'
- crossorigin="anonymous"></script>
- </body>
- </html>
|