text:
layout: post
title: "ADB로 APK 꺼내기"
categories: [Android]
tags: [ADB]
---

# 패키지 리스트 출력

```
adb shell pm list packages

package:com.android.cts.priv.ctsshim
package:com.google.android.youtube
package:com.android.internal.display.cutout.emulation.corner
package:com.google.android.ext.services
...
..
.

```

# APK 경로 출력

```
adb shell pm list packages -f

package:/system/priv-app/CtsShimPrivPrebuilt/CtsShimPrivPrebuilt.apk=com.android.cts.priv.ctsshim
package:/data/app/com.google.android.youtube-YS_XxihcEwIHaldPXW07LA==/base.apk=com.google.android.youtube
package:/vendor/overlay/DisplayCutoutEmulationCorner/DisplayCutoutEmulationCornerOverlay.apk=com.android.internal.display.cutout.emulation.corner
...
..
.

```

# 유저가 설치한 APK 출력

```
adb shell pm list packages -f -3  // -3은 서드파티를 의미

package:/data/app/io.github.ovso.shortcuts--X0Tga1i9D14TWyOHaFmhw==/base.apk=io.github.ovso.shortcuts
package:/data/app/io.github.ovso.righttoknow-C7L4kzU5cf2vU-wnOw1stQ==/base.apk=io.github.ovso.righttoknow
package:/data/app/com.mycelebs.excitingbooking-IXPgUQHfvdf3PfjkO0H1mw==/base.apk=com.mycelebs.excitingbooking
...
..
.
```

# APK 가져오기(꺼내기)

```
adb pull /data/app/io.github.ovso.shortcuts--X0Tga1i9D14TWyOHaFmhw==/base.apk
```

adb pull 이후 .apk로 끝나는 경로까지만 입력한다.

저장되는 곳은, 명령어를 입력한 위치다.


text:
package ai.verta.swagger._public.modeldb.versioning.model

import scala.util.Try

import net.liftweb.json._

import ai.verta.swagger._public.modeldb.versioning.model.DiffStatusEnumDiffStatus._
import ai.verta.swagger._public.modeldb.versioning.model.OperatorEnumOperator._
import ai.verta.swagger._public.modeldb.versioning.model.ProtobufNullValue._
import ai.verta.swagger._public.modeldb.versioning.model.RepositoryVisibilityEnumRepositoryVisibility._
import ai.verta.swagger._public.modeldb.versioning.model.ValueTypeEnumValueType._
import ai.verta.swagger._public.modeldb.versioning.model.VersioningBlobType._
import ai.verta.swagger._public.modeldb.versioning.model.WorkspaceTypeEnumWorkspaceType._
import ai.verta.swagger.client.objects._

case class VersioningBlobDiff (
  code: Option[VersioningCodeDiff] = None,
  config: Option[VersioningConfigDiff] = None,
  dataset: Option[VersioningDatasetDiff] = None,
  environment: Option[VersioningEnvironmentDiff] = None,
  location: Option[List[String]] = None,
  status: Option[DiffStatusEnumDiffStatus] = None
) extends BaseSwagger {
  def toJson(): JValue = VersioningBlobDiff.toJson(this)
}

object VersioningBlobDiff {
  def toJson(obj: VersioningBlobDiff): JObject = {
    new JObject(
      List[Option[JField]](
        obj.code.map(x => JField("code", ((x: VersioningCodeDiff) => VersioningCodeDiff.toJson(x))(x))),
        obj.config.map(x => JField("config", ((x: VersioningConfigDiff) => VersioningConfigDiff.toJson(x))(x))),
        obj.dataset.map(x => JField("dataset", ((x: VersioningDatasetDiff) => VersioningDatasetDiff.toJson(x))(x))),
        obj.environment.map(x => JField("environment", ((x: VersioningEnvironmentDiff) => VersioningEnvironmentDiff.toJson(x))(x))),
        obj.location.map(x => JField("location", ((x: List[String]) => JArray(x.map(JString)))(x))),
        obj.status.map(x => JField("status", ((x: DiffStatusEnumDiffStatus) => DiffStatusEnumDiffStatus.toJson(x))(x)))
      ).flatMap(x => x match {
        case Some(y) => List(y)
        case None => Nil
      })
    )
  }

  def fromJson(value: JValue): VersioningBlobDiff =
    value match {
      case JObject(fields) => {
        val fieldsMap = fields.map(f => (f.name, f.value)).toMap
        VersioningBlobDiff(
          // TODO: handle required
          code = fieldsMap.get("code").map(VersioningCodeDiff.fromJson),
          config = fieldsMap.get("config").map(VersioningConfigDiff.fromJson),
          dataset = fieldsMap.get("dataset").map(VersioningDatasetDiff.fromJson),
          environment = fieldsMap.get("environment").map(VersioningEnvironmentDiff.fromJson),
          location = fieldsMap.get("location").map((x: JValue) => x match {case JArray(elements) => elements.map(JsonConverter.fromJsonString); case _ => throw new IllegalArgumentException(s"unknown type ${x.getClass.toString}")}),
          status = fieldsMap.get("status").map(DiffStatusEnumDiffStatus.fromJson)
        )
      }
      case _ => throw new IllegalArgumentException(s"unknown type ${value.getClass.toString}")
    }
}

redpajama_set_name: RedPajamaGithub


text:
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vhudson-jaxb-ri-2.1-548
// See http://java.sun.com/xml/jaxb
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2015.01.12 at 10:26:14 AM CST
//

package com.mastercard.api.partnerwallet.domain.all;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;

/**
 *
Java class for PrecheckoutDataResponse complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType name="PrecheckoutDataResponse">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="PrecheckoutData" type="{}PrecheckoutData"/>
 *         <element name="WalletPartnerLogoUrl" type="{http://www.w3.org/2001/XMLSchema}anyURI"/>
 *         <element name="MasterpassLogoUrl" type="{http://www.w3.org/2001/XMLSchema}anyURI"/>
 *         <element name="LongAccessToken" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         <element name="ExtensionPoint" type="{}ExtensionPoint" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 *

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PrecheckoutDataResponse", propOrder = {
    "precheckoutData",
    "walletPartnerLogoUrl",
    "masterpassLogoUrl",
    "longAccessToken",
    "extensionPoint"
})
public class PrecheckoutDataResponse {

    @XmlElement(name = "PrecheckoutData", required = true)
    protected PrecheckoutData precheckoutData;
    @XmlElement(name = "WalletPartnerLogoUrl", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String walletPartnerLogoUrl;
    @XmlElement(name = "MasterpassLogoUrl", required = true)
    @XmlSchemaType(name = "anyURI")
    protected String masterpassLogoUrl;
    @XmlElement(name = "LongAccessToken", required = true)
    protected String longAccessToken;
    @XmlElement(name = "ExtensionPoint")
    protected ExtensionPoint extensionPoint;

    /**
     * Gets the value of the precheckoutData property.
     *
     * @return
     *     possible object is
     *     {@link PrecheckoutData }
     *
     */
    public PrecheckoutData getPrecheckoutData() {
        return precheckoutData;
    }

    /**
     * Sets the value of the precheckoutData property.
     *
     * @param value
     *     allowed object is
     *     {@link PrecheckoutData }
     *
     */
    public void setPrecheckoutData(PrecheckoutData value) {
        this.precheckoutData = value;
    }

    /**
     * Gets the value of the walletPartnerLogoUrl property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getWalletPartnerLogoUrl() {
        return walletPartnerLogoUrl;
    }

    /**
     * Sets the value of the walletPartnerLogoUrl property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setWalletPartnerLogoUrl(String value) {
        this.walletPartnerLogoUrl = value;
    }

    /**
     * Gets the value of the masterpassLogoUrl property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getMasterpassLogoUrl() {
        return masterpassLogoUrl;
    }

    /**
     * Sets the value of the masterpassLogoUrl property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setMasterpassLogoUrl(String value) {
        this.masterpassLogoUrl = value;
    }

    /**
     * Gets the value of the longAccessToken property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    public String getLongAccessToken() {
        return longAccessToken;
    }

    /**
     * Sets the value of the longAccessToken property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    public void setLongAccessToken(String value) {
        this.longAccessToken = value;
    }

    /**
     * Gets the value of the extensionPoint property.
     *
     * @return
     *     possible object is
     *     {@link ExtensionPoint }
     *
     */
    public ExtensionPoint getExtensionPoint() {
        return extensionPoint;
    }

    /**
     * Sets the value of the extensionPoint property.
     *
     * @param value
     *     allowed object is
     *     {@link ExtensionPoint }
     *
     */
    public void setExtensionPoint(ExtensionPoint value) {
        this.extensionPoint = value;
    }

}


text:
package org.zstack.test.compute.vm;

import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.zstack.core.cloudbus.CloudBus;
import org.zstack.core.componentloader.ComponentLoader;
import org.zstack.core.db.DatabaseFacade;
import org.zstack.core.db.SimpleQuery;
import org.zstack.core.db.SimpleQuery.Op;
import org.zstack.header.configuration.DiskOfferingVO;
import org.zstack.header.configuration.DiskOfferingVO_;
import org.zstack.header.vm.VmInstanceInventory;
import org.zstack.header.volume.VolumeInventory;
import org.zstack.header.volume.VolumeStatus;
import org.zstack.header.volume.VolumeVO;
import org.zstack.test.Api;
import org.zstack.test.ApiSenderException;
import org.zstack.test.DBUtil;
import org.zstack.test.deployer.Deployer;

public class TestAttachVolumeToVm3 {
    Deployer deployer;
    Api api;
    ComponentLoader loader;
    CloudBus bus;
    DatabaseFacade dbf;

    @Before
    public void setUp() throws Exception {
        DBUtil.reDeployDB();
        deployer = new Deployer("deployerXml/vm/TestAttachVolumeToVm.xml");
        deployer.build();
        api = deployer.getApi();
        loader = deployer.getComponentLoader();
        bus = loader.getComponent(CloudBus.class);
        dbf = loader.getComponent(DatabaseFacade.class);
    }

    @Test
    public void test() throws ApiSenderException {
        SimpleQuery<DiskOfferingVO> dq = dbf.createQuery(DiskOfferingVO.class);
        dq.add(DiskOfferingVO_.name, Op.EQ, "TestDataDiskOffering");
        DiskOfferingVO dvo = dq.find();
        VolumeInventory vinv = api.createDataVolume("TestData", dvo.getUuid());
        VmInstanceInventory vminv = api.listVmInstances(null).get(0);
        api.stopVmInstance(vminv.getUuid());

        vinv = api.attachVolumeToVm(vminv.getUuid(), vinv.getUuid());
        Assert.assertTrue(vinv.isAttached());
        Assert.assertEquals(VolumeStatus.Ready.toString(), vinv.getStatus());
        Assert.assertNotNull(vinv.getPrimaryStorageUuid());
        Assert.assertNotNull(vinv.getVmInstanceUuid());
        VolumeVO vvo = dbf.findByUuid(vinv.getUuid(), VolumeVO.class);
        Assert.assertTrue(vvo.isAttached());
        Assert.assertEquals(VolumeStatus.Ready, vvo.getStatus());
        Assert.assertNotNull(vvo.getPrimaryStorageUuid());
        Assert.assertNotNull(vvo.getVmInstanceUuid());
    }
}


text:
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
    if (kind === "m") throw new TypeError("Private method is not writable");
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
    return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
    if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
    if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
    return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Time_player, _Time_current, _Time_delimiter, _Time_duration, _Time_container, _Time_events, _Time_labels, _Time_position, _Time_layer;
import { EVENT_OPTIONS } from '../utils/constants';
import { removeElement } from '../utils/general';
import { formatTime } from '../utils/time';
class Time {
    constructor(player, position, layer) {
        _Time_player.set(this, void 0);
        _Time_current.set(this, void 0);
        _Time_delimiter.set(this, void 0);
        _Time_duration.set(this, void 0);
        _Time_container.set(this, void 0);
        _Time_events.set(this, {
            controls: {},
            media: {},
        });
        _Time_labels.set(this, void 0);
        _Time_position.set(this, void 0);
        _Time_layer.set(this, void 0);
        __classPrivateFieldSet(this, _Time_player, player, "f");
        __classPrivateFieldSet(this, _Time_labels, player.getOptions().labels, "f");
        __classPrivateFieldSet(this, _Time_position, position, "f");
        __classPrivateFieldSet(this, _Time_layer, layer, "f");
        return this;
    }
    create() {
        __classPrivateFieldSet(this, _Time_current, document.createElement('time'), "f");
        __classPrivateFieldGet(this, _Time_current, "f").className = 'op-controls__current';
        __classPrivateFieldGet(this, _Time_current, "f").setAttribute('role', 'timer');
        __classPrivateFieldGet(this, _Time_current, "f").setAttribute('aria-live', 'off');
        __classPrivateFieldGet(this, _Time_current, "f").setAttribute('aria-hidden', 'false');
        __classPrivateFieldGet(this, _Time_current, "f").innerText = '0:00';
        const showOnlyCurrent = __classPrivateFieldGet(this, _Time_player, "f").getOptions().progress.showCurrentTimeOnly;
        if (!showOnlyCurrent) {
            __classPrivateFieldSet(this, _Time_delimiter, document.createElement('span'), "f");
            __classPrivateFieldGet(this, _Time_delimiter, "f").className = 'op-controls__time-delimiter';
            __classPrivateFieldGet(this, _Time_delimiter, "f").setAttribute('aria-hidden', 'false');
            __classPrivateFieldGet(this, _Time_delimiter, "f").innerText = '/';
            __classPrivateFieldSet(this, _Time_duration, document.createElement('time'), "f");
            __classPrivateFieldGet(this, _Time_duration, "f").className = 'op-controls__duration';
            __classPrivateFieldGet(this, _Time_duration, "f").setAttribute('aria-hidden', 'false');
            __classPrivateFieldGet(this, _Time_duration, "f").innerText = formatTime(__classPrivateFieldGet(this, _Time_player, "f").getOptions().progress.duration);
        }
        const controls = __classPrivateFieldGet(this, _Time_player, "f").getControls().getLayer(__classPrivateFieldGet(this, _Time_layer, "f"));
        __classPrivateFieldSet(this, _Time_container, document.createElement('span'), "f");
        __classPrivateFieldGet(this, _Time_container, "f").className = `op-controls-time op-control__${__classPrivateFieldGet(this, _Time_position, "f")}`;
        __classPrivateFieldGet(this, _Time_container, "f").appendChild(__classPrivateFieldGet(this, _Time_current, "f"));
        if (!showOnlyCurrent) {
            __classPrivateFieldGet(this, _Time_container, "f").appendChild(__classPrivateFieldGet(this, _Time_delimiter, "f"));
            __classPrivateFieldGet(this, _Time_container, "f").appendChild(__classPrivateFieldGet(this, _Time_duration, "f"));
        }
        controls.appendChild(__classPrivateFieldGet(this, _Time_container, "f"));
        const setInitialTime = () => {
            const el = __classPrivateFieldGet(this, _Time_player, "f").activeElement();
            if (el.duration !== Infinity && !__classPrivateFieldGet(this, _Time_player, "f").getElement().getAttribute('op-live__enabled')) {
                if (!showOnlyCurrent) {
                    const duration = !isNaN(el.duration) ? el.duration : __classPrivateFieldGet(this, _Time_player, "f").getOptions().progress.duration;
                    __classPrivateFieldGet(this, _Time_duration, "f").innerText = formatTime(duration);
                }
                __classPrivateFieldGet(this, _Time_current, "f").innerText = formatTime(el.currentTime);
            }
            else {
                if (!showOnlyCurrent) {
                    __classPrivateFieldGet(this, _Time_duration, "f").setAttribute('aria-hidden', 'true');
                }
                __classPrivateFieldGet(this, _Time_delimiter, "f").setAttribute('aria-hidden', 'true');
            }
        };
        __classPrivateFieldGet(this, _Time_events, "f").media.loadedmetadata = setInitialTime.bind(this);
        __classPrivateFieldGet(this, _Time_events, "f").controls.controlschanged = setInitialTime.bind(this);
        const { showLabel: showLiveLabel } = __classPrivateFieldGet(this, _Time_player, "f").getOptions().live;
        __classPrivateFieldGet(this, _Time_events, "f").media.timeupdate = () => {
            const el = __classPrivateFieldGet(this, _Time_player, "f").activeElement();
            if (el.duration !== Infinity && !__classPrivateFieldGet(this, _Time_player, "f").getElement().getAttribute('op-live__enabled') &&
                !__classPrivateFieldGet(this, _Time_player, "f").getElement().getAttribute('op-dvr__enabled')) {
                const duration = formatTime(el.duration);
                if (!showOnlyCurrent && !isNaN(el.duration) && duration !== __classPrivateFieldGet(this, _Time_duration, "f").innerText) {
                    __classPrivateFieldGet(this, _Time_duration, "f").innerText = duration;
                    __classPrivateFieldGet(this, _Time_duration, "f").setAttribute('aria-hidden', 'false');
                    __classPrivateFieldGet(this, _Time_delimiter, "f").setAttribute('aria-hidden', 'false');
                }
                else if (showOnlyCurrent || duration !== __classPrivateFieldGet(this, _Time_duration, "f").innerText) {
                    __classPrivateFieldGet(this, _Time_current, "f").innerText = showLiveLabel ? __classPrivateFieldGet(this, _Time_labels, "f").live : formatTime(el.currentTime);
                }
                __classPrivateFieldGet(this, _Time_current, "f").innerText = formatTime(el.currentTime);
            }
            else if (__classPrivateFieldGet(this, _Time_player, "f").getElement().getAttribute('op-dvr__enabled')) {
                if (!showOnlyCurrent) {
                    __classPrivateFieldGet(this, _Time_duration, "f").setAttribute('aria-hidden', 'true');
                    __classPrivateFieldGet(this, _Time_delimiter, "f").setAttribute('aria-hidden', 'true');
                }
                __classPrivateFieldGet(this, _Time_current, "f").innerText = formatTime(el.currentTime);
            }
            else if (showOnlyCurrent || (!__classPrivateFieldGet(this, _Time_player, "f").getElement().getAttribute('op-dvr__enabled') &&
                __classPrivateFieldGet(this, _Time_duration, "f").getAttribute('aria-hidden') === 'false')) {
                if (!showOnlyCurrent) {
                    __classPrivateFieldGet(this, _Time_duration, "f").setAttribute('aria-hidden', 'true');
                    __classPrivateFieldGet(this, _Time_delimiter, "f").setAttribute('aria-hidden', 'true');
                }
                __classPrivateFieldGet(this, _Time_current, "f").innerText = showLiveLabel ? __classPrivateFieldGet(this, _Time_labels, "f").live : formatTime(el.currentTime);
            }
            else {
                __classPrivateFieldGet(this, _Time_current, "f").innerText = showLiveLabel ? __classPrivateFieldGet(this, _Time_labels, "f").live : formatTime(el.currentTime);
            }
        };
        __classPrivateFieldGet(this, _Time_events, "f").media.ended = () => {
            const el = __classPrivateFieldGet(this, _Time_player, "f").activeElement();
            const duration = !isNaN(el.duration) ? el.duration : __classPrivateFieldGet(this, _Time_player, "f").getOptions().progress.duration;
            if (!showOnlyCurrent && __classPrivateFieldGet(this, _Time_player, "f").isMedia()) {
                __classPrivateFieldGet(this, _Time_duration, "f").innerText = formatTime(duration);
            }
        };
        Object.keys(__classPrivateFieldGet(this, _Time_events, "f").media).forEach(event => {
            __classPrivateFieldGet(this, _Time_player, "f").getElement().addEventListener(event, __classPrivateFieldGet(this, _Time_events, "f").media[event], EVENT_OPTIONS);
        });
        __classPrivateFieldGet(this, _Time_player, "f").getControls().getContainer().addEventListener('controlschanged', __classPrivateFieldGet(this, _Time_events, "f").controls.controlschanged, EVENT_OPTIONS);
    }
    destroy() {
        Object.keys(__classPrivateFieldGet(this, _Time_events, "f").media).forEach(event => {
            __classPrivateFieldGet(this, _Time_player, "f").getElement().removeEventListener(event, __classPrivateFieldGet(this, _Time_events, "f").media[event]);
        });
        __classPrivateFieldGet(this, _Time_player, "f").getControls().getContainer().removeEventListener('controlschanged', __classPrivateFieldGet(this, _Time_events, "f").controls.controlschanged);
        removeElement(__classPrivateFieldGet(this, _Time_current, "f"));
        if (!__classPrivateFieldGet(this, _Time_player, "f").getOptions().progress.showCurrentTimeOnly) {
            removeElement(__classPrivateFieldGet(this, _Time_delimiter, "f"));
            removeElement(__classPrivateFieldGet(this, _Time_duration, "f"));
        }
        removeElement(__classPrivateFieldGet(this, _Time_container, "f"));
    }
}
_Time_player = new WeakMap(), _Time_current = new WeakMap(), _Time_delimiter = new WeakMap(), _Time_duration = new WeakMap(), _Time_container = new WeakMap(), _Time_events = new WeakMap(), _Time_labels = new WeakMap(), _Time_position = new WeakMap(), _Time_layer = new WeakMap();
export default Time;


text:
package bj.vinylbrowser.release;

import bj.vinylbrowser.di.scopes.FragmentScope;
import dagger.Subcomponent;

/**
 * Created by Josh Laird on 23/04/2017.
 */
@FragmentScope
@Subcomponent(modules = {ReleaseModule.class})
public interface ReleaseComponent
{
    void inject(ReleaseController controller);

    @Subcomponent.Builder
    interface Builder
    {
        Builder releaseModule(ReleaseModule module);

        ReleaseComponent build();
    }
}


text:
import { InMemoryDbService } from 'angular-in-memory-web-api';

export class InMemoryBasesService implements InMemoryDbService {
  createDb() {
    let base = [
      {id: 1, size: 1, server: 'Red-Hat', network: 'Cat 5e', facilities: ['basicComputing', 'basicWashing', 'basicCleaning', 'basicSleeping', 'basicEating'], inbase: [1, 3], onmission: [2, 4]},
    ];
    return {base};
  }
}


text:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<feed><tipo>Rua</tipo><logradouro>Itu</logradouro><bairro>São Jerônimo</bairro><cidade>Gravataí</cidade><uf>RS</uf><cep>94055360</cep></feed>


text:
<!DOCTYPE html>
<title>Layout Instability: shift in pointerdown becoming scroll</title>
<link rel="help" href="https://wicg.github.io/layout-instability/" />