WebKit Bugzilla
Attachment 342231 Details for
Bug 186416
: Add support for dumping GC heap snapshots, and a viewer
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-186416-20180607191551.patch (text/plain), 514.73 KB, created by
Simon Fraser (smfr)
on 2018-06-07 19:15:52 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Simon Fraser (smfr)
Created:
2018-06-07 19:15:52 PDT
Size:
514.73 KB
patch
obsolete
>Subversion Revision: 232484 >diff --git a/Source/JavaScriptCore/ChangeLog b/Source/JavaScriptCore/ChangeLog >index 4fbf96aeab1e7997342f7d4f6ec3b81e0e58383d..f3520b99a4541e808b4f201275f8427e1f49bd69 100644 >--- a/Source/JavaScriptCore/ChangeLog >+++ b/Source/JavaScriptCore/ChangeLog >@@ -1,3 +1,74 @@ >+2018-06-07 Simon Fraser <simon.fraser@apple.com> >+ >+ Add support for dumping GC heap snapshots, and a viewer >+ https://bugs.webkit.org/show_bug.cgi?id=186416 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Make a way to dump information about the GC heap that is useful for looking for leaked >+ or abandoned objects. This dump is obtained via: >+ notifyutil -p com.apple.WebKit.dumpGCHeap >+ which writes a JSON file to /tmp which can then be loaded into the viewer in Tools/GCHeapInspector. >+ >+ This leverages the heap snapshot used by Web Inspector, adding an alternate format for >+ the snapshot JSON that adds additional data about objects and why they are GC roots. >+ >+ SlotVisitor maintains a RootMarkReason (via SetRootMarkReasonScope) that allows >+ the HeapSnapshotBuilder to keep track of why a JSCell was treated as a GC root. For >+ objects visited via opaque roots, we record the reason why via a new out param to >+ isReachableFromOpaqueRoots(). >+ >+ HeapSnapshotBuilder is enhanced to produce GCDebuggingSnapshot JSON output. This contains >+ additional information including the address of the JSCell* and the wrapped object (for >+ JSDOMWrappers), the root reasons, and for some objects like JSDocument a label which can >+ be the document URL. >+ >+ GCDebuggingSnapshots are always full snapshots (previous snapshots are not kept around). >+ >+ * API/JSAPIWrapperObject.mm: >+ (JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots): >+ * API/JSManagedValue.mm: >+ (JSManagedValueHandleOwner::isReachableFromOpaqueRoots): >+ * heap/ConservativeRoots.h: >+ (JSC::ConservativeRoots::size const): >+ (JSC::ConservativeRoots::size): Deleted. >+ * heap/Heap.cpp: >+ (JSC::Heap::addCoreConstraints): >+ * heap/HeapSnapshotBuilder.cpp: >+ (JSC::HeapSnapshotBuilder::getNextObjectIdentifier): >+ (JSC::HeapSnapshotBuilder::HeapSnapshotBuilder): >+ (JSC::HeapSnapshotBuilder::buildSnapshot): >+ (JSC::HeapSnapshotBuilder::appendNode): >+ (JSC::HeapSnapshotBuilder::appendEdge): >+ (JSC::HeapSnapshotBuilder::setOpaqueRootReachabilityReasonForCell): >+ (JSC::HeapSnapshotBuilder::setWrappedObjectForCell): >+ (JSC::HeapSnapshotBuilder::previousSnapshotHasNodeForCell): >+ (JSC::snapshotTypeToString): >+ (JSC::rootTypeToString): >+ (JSC::HeapSnapshotBuilder::setLabelForCell): >+ (JSC::HeapSnapshotBuilder::descriptionForCell const): >+ (JSC::HeapSnapshotBuilder::json): >+ (JSC::HeapSnapshotBuilder::~HeapSnapshotBuilder): Deleted. >+ (JSC::HeapSnapshotBuilder::hasExistingNodeForCell): Deleted. >+ * heap/HeapSnapshotBuilder.h: >+ * heap/SlotVisitor.cpp: >+ (JSC::SlotVisitor::appendSlow): >+ * heap/SlotVisitor.h: >+ (JSC::SlotVisitor::heapSnapshotBuilder const): >+ (JSC::SlotVisitor::rootMarkReason const): >+ (JSC::SlotVisitor::setRootMarkReason): >+ (JSC::SetRootMarkReasonScope::SetRootMarkReasonScope): >+ (JSC::SetRootMarkReasonScope::~SetRootMarkReasonScope): >+ * heap/WeakBlock.cpp: >+ (JSC::WeakBlock::specializedVisit): >+ * heap/WeakHandleOwner.cpp: >+ (JSC::WeakHandleOwner::isReachableFromOpaqueRoots): >+ * heap/WeakHandleOwner.h: >+ * runtime/SimpleTypedArrayController.cpp: >+ (JSC::SimpleTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots): >+ * runtime/SimpleTypedArrayController.h: >+ * tools/JSDollarVM.cpp: >+ > 2018-06-04 Keith Miller <keith_miller@apple.com> > > JSLock should clear last exception when releasing the lock >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index b1bb9050764af10268a1f50897283a50c693059b..92f1a36c51798ca762671ebf24254ad9b637a1d4 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,318 @@ >+2018-06-07 Simon Fraser <simon.fraser@apple.com> >+ >+ Add support for dumping GC heap snapshots, and a viewer >+ https://bugs.webkit.org/show_bug.cgi?id=186416 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Make a way to dump information about the GC heap that is useful for looking for leaked >+ or abandoned objects. This dump is obtained via: >+ notifyutil -p com.apple.WebKit.dumpGCHeap >+ which writes a JSON file to /tmp which can then be loaded into the viewer in Tools/GCHeapInspector. >+ >+ This leverages the heap snapshot used by Web Inspector, adding an alternate format for >+ the snapshot JSON that adds additional data about objects and why they are GC roots. >+ >+ The generated bindings code is changed to include the output root reason from isReachableFromOpaqueRoots(), >+ and to implement heapSnapshot() which provides the address of the wrapped object. A new IDL attribute, >+ CustomHeapSnapshot, is used to allow custom heapSnapshot() implementations for classes like JSDocument >+ that need to decorate the heap snapshot cell data with things like the document URL. >+ >+ GCController registers a notifyutil callback which gathers the debug heap snapshot, and dumps it >+ to a file in /tmp. The file path is printed out to the system log. >+ >+ * Sources.txt: >+ * WebCore.xcodeproj/project.pbxproj: >+ * bindings/js/DOMGCOutputConstraint.cpp: >+ (WebCore::DOMGCOutputConstraint::executeImpl): >+ * bindings/js/GCController.cpp: >+ (WebCore::GCController::GCController): >+ (WebCore::GCController::dumpHeap): >+ * bindings/js/GCController.h: >+ * bindings/js/JSCSSRuleListCustom.cpp: >+ (WebCore::JSCSSRuleListOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSCallbackData.cpp: >+ (WebCore::JSCallbackDataWeak::WeakOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSCallbackData.h: >+ * bindings/js/JSCanvasRenderingContext2DCustom.cpp: >+ (WebCore::JSCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSDOMTokenListCustom.cpp: Copied from Source/WebCore/bindings/js/JSCSSRuleListCustom.cpp. >+ (WebCore::JSDOMTokenList::heapSnapshot): >+ * bindings/js/JSDOMWindowCustom.cpp: >+ (WebCore::JSDOMWindow::getOwnPropertySlot): >+ (WebCore::JSDOMWindow::heapSnapshot): >+ * bindings/js/JSDeprecatedCSSOMValueCustom.cpp: >+ (WebCore::JSDeprecatedCSSOMValueOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSDocumentCustom.cpp: >+ (WebCore::JSDocument::heapSnapshot): >+ * bindings/js/JSHTMLCollectionCustom.cpp: >+ (WebCore::JSHTMLCollection::heapSnapshot): >+ * bindings/js/JSMutationObserverCustom.cpp: >+ (WebCore::JSMutationObserverOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSNodeCustom.cpp: >+ (WebCore::isReachableFromDOM): >+ (WebCore::JSNodeOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSNodeListCustom.cpp: >+ (WebCore::JSNodeListOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSOffscreenCanvasRenderingContext2DCustom.cpp: >+ (WebCore::JSOffscreenCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots): >+ * bindings/js/JSTextTrackCueCustom.cpp: >+ (WebCore::JSTextTrackCueOwner::isReachableFromOpaqueRoots): >+ * bindings/js/ScriptController.cpp: >+ * bindings/js/WebCoreTypedArrayController.cpp: >+ (WebCore::WebCoreTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots): >+ * bindings/js/WebCoreTypedArrayController.h: >+ * bindings/scripts/CodeGeneratorJS.pm: >+ (GenerateHeader): >+ (GenerateImplementation): >+ * bindings/scripts/IDLAttributes.json: >+ * bindings/scripts/test/JS/JSInterfaceName.cpp: >+ (WebCore::JSInterfaceName::heapSnapshot): >+ (WebCore::JSInterfaceNameOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSInterfaceName.h: >+ * bindings/scripts/test/JS/JSMapLike.cpp: >+ (WebCore::JSMapLike::heapSnapshot): >+ (WebCore::JSMapLikeOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSMapLike.h: >+ * bindings/scripts/test/JS/JSReadOnlyMapLike.cpp: >+ (WebCore::JSReadOnlyMapLike::heapSnapshot): >+ (WebCore::JSReadOnlyMapLikeOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSReadOnlyMapLike.h: >+ * bindings/scripts/test/JS/JSTestActiveDOMObject.cpp: >+ (WebCore::JSTestActiveDOMObject::heapSnapshot): >+ (WebCore::JSTestActiveDOMObjectOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestActiveDOMObject.h: >+ * bindings/scripts/test/JS/JSTestCEReactions.cpp: >+ (WebCore::JSTestCEReactions::heapSnapshot): >+ (WebCore::JSTestCEReactionsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestCEReactions.h: >+ * bindings/scripts/test/JS/JSTestCEReactionsStringifier.cpp: >+ (WebCore::JSTestCEReactionsStringifier::heapSnapshot): >+ (WebCore::JSTestCEReactionsStringifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestCEReactionsStringifier.h: >+ * bindings/scripts/test/JS/JSTestCallTracer.cpp: >+ (WebCore::JSTestCallTracer::heapSnapshot): >+ (WebCore::JSTestCallTracerOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestCallTracer.h: >+ * bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp: >+ (WebCore::JSTestClassWithJSBuiltinConstructor::heapSnapshot): >+ (WebCore::JSTestClassWithJSBuiltinConstructorOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h: >+ * bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.cpp: >+ (WebCore::JSTestCustomConstructorWithNoInterfaceObject::heapSnapshot): >+ (WebCore::JSTestCustomConstructorWithNoInterfaceObjectOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h: >+ * bindings/scripts/test/JS/JSTestDOMJIT.cpp: >+ (WebCore::JSTestDOMJIT::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestDOMJIT.h: >+ * bindings/scripts/test/JS/JSTestEnabledBySetting.cpp: >+ (WebCore::JSTestEnabledBySetting::heapSnapshot): >+ (WebCore::JSTestEnabledBySettingOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestEnabledBySetting.h: >+ * bindings/scripts/test/JS/JSTestEventConstructor.cpp: >+ (WebCore::JSTestEventConstructor::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestEventConstructor.h: >+ * bindings/scripts/test/JS/JSTestEventTarget.cpp: >+ (WebCore::JSTestEventTarget::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestEventTarget.h: >+ * bindings/scripts/test/JS/JSTestException.cpp: >+ (WebCore::JSTestException::heapSnapshot): >+ (WebCore::JSTestExceptionOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestException.h: >+ * bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp: >+ (WebCore::JSTestGenerateIsReachable::heapSnapshot): >+ (WebCore::JSTestGenerateIsReachableOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestGenerateIsReachable.h: >+ * bindings/scripts/test/JS/JSTestGlobalObject.cpp: >+ (WebCore::JSTestGlobalObject::heapSnapshot): >+ (WebCore::JSTestGlobalObjectOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestGlobalObject.h: >+ * bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.cpp: >+ (WebCore::JSTestIndexedSetterNoIdentifier::heapSnapshot): >+ (WebCore::JSTestIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.h: >+ * bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.cpp: >+ (WebCore::JSTestIndexedSetterThrowingException::heapSnapshot): >+ (WebCore::JSTestIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.h: >+ * bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.cpp: >+ (WebCore::JSTestIndexedSetterWithIdentifier::heapSnapshot): >+ (WebCore::JSTestIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.h: >+ * bindings/scripts/test/JS/JSTestInterface.cpp: >+ (WebCore::JSTestInterface::heapSnapshot): >+ (WebCore::JSTestInterfaceOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestInterface.h: >+ * bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.cpp: >+ (WebCore::JSTestInterfaceLeadingUnderscore::heapSnapshot): >+ (WebCore::JSTestInterfaceLeadingUnderscoreOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.h: >+ * bindings/scripts/test/JS/JSTestIterable.cpp: >+ (WebCore::JSTestIterable::heapSnapshot): >+ (WebCore::JSTestIterableOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestIterable.h: >+ * bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp: >+ (WebCore::JSTestMediaQueryListListener::heapSnapshot): >+ (WebCore::JSTestMediaQueryListListenerOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestMediaQueryListListener.h: >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.cpp: >+ (WebCore::JSTestNamedAndIndexedSetterNoIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedAndIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.cpp: >+ (WebCore::JSTestNamedAndIndexedSetterThrowingException::heapSnapshot): >+ (WebCore::JSTestNamedAndIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.h: >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.cpp: >+ (WebCore::JSTestNamedAndIndexedSetterWithIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedAndIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedConstructor.cpp: >+ (WebCore::JSTestNamedConstructor::heapSnapshot): >+ (WebCore::JSTestNamedConstructorOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedConstructor.h: >+ * bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.cpp: >+ (WebCore::JSTestNamedDeleterNoIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedDeleterNoIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.cpp: >+ (WebCore::JSTestNamedDeleterThrowingException::heapSnapshot): >+ (WebCore::JSTestNamedDeleterThrowingExceptionOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.h: >+ * bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.cpp: >+ (WebCore::JSTestNamedDeleterWithIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedDeleterWithIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.cpp: >+ (WebCore::JSTestNamedDeleterWithIndexedGetter::heapSnapshot): >+ (WebCore::JSTestNamedDeleterWithIndexedGetterOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.h: >+ * bindings/scripts/test/JS/JSTestNamedGetterCallWith.cpp: >+ (WebCore::JSTestNamedGetterCallWith::heapSnapshot): >+ (WebCore::JSTestNamedGetterCallWithOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedGetterCallWith.h: >+ * bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.cpp: >+ (WebCore::JSTestNamedGetterNoIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedGetterNoIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.cpp: >+ (WebCore::JSTestNamedGetterWithIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedGetterWithIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.cpp: >+ (WebCore::JSTestNamedSetterNoIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedSetterNoIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterThrowingException.cpp: >+ (WebCore::JSTestNamedSetterThrowingException::heapSnapshot): >+ (WebCore::JSTestNamedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterThrowingException.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.cpp: >+ (WebCore::JSTestNamedSetterWithIdentifier::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithIdentifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.cpp: >+ (WebCore::JSTestNamedSetterWithIndexedGetter::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithIndexedGetterOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.cpp: >+ (WebCore::JSTestNamedSetterWithIndexedGetterAndSetter::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithIndexedGetterAndSetterOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.cpp: >+ (WebCore::JSTestNamedSetterWithOverrideBuiltins::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithOverrideBuiltinsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.cpp: >+ (WebCore::JSTestNamedSetterWithUnforgableProperties::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithUnforgablePropertiesOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.h: >+ * bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.cpp: >+ (WebCore::JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins::heapSnapshot): >+ (WebCore::JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltinsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.h: >+ * bindings/scripts/test/JS/JSTestNode.cpp: >+ (WebCore::JSTestNode::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestNode.h: >+ * bindings/scripts/test/JS/JSTestObj.cpp: >+ (WebCore::JSTestObj::heapSnapshot): >+ (WebCore::JSTestObjOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestObj.h: >+ * bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp: >+ (WebCore::JSTestOverloadedConstructors::heapSnapshot): >+ (WebCore::JSTestOverloadedConstructorsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestOverloadedConstructors.h: >+ * bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.cpp: >+ (WebCore::JSTestOverloadedConstructorsWithSequence::heapSnapshot): >+ (WebCore::JSTestOverloadedConstructorsWithSequenceOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.h: >+ * bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp: >+ (WebCore::JSTestOverrideBuiltins::heapSnapshot): >+ (WebCore::JSTestOverrideBuiltinsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestOverrideBuiltins.h: >+ * bindings/scripts/test/JS/JSTestPluginInterface.cpp: >+ (WebCore::JSTestPluginInterface::heapSnapshot): >+ (WebCore::JSTestPluginInterfaceOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestPluginInterface.h: >+ * bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp: >+ (WebCore::JSTestPromiseRejectionEvent::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h: >+ * bindings/scripts/test/JS/JSTestSerialization.cpp: >+ (WebCore::JSTestSerialization::heapSnapshot): >+ (WebCore::JSTestSerializationOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestSerialization.h: >+ * bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp: >+ (WebCore::JSTestSerializationIndirectInheritance::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h: >+ * bindings/scripts/test/JS/JSTestSerializationInherit.cpp: >+ (WebCore::JSTestSerializationInherit::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestSerializationInherit.h: >+ * bindings/scripts/test/JS/JSTestSerializationInheritFinal.cpp: >+ (WebCore::JSTestSerializationInheritFinal::heapSnapshot): >+ * bindings/scripts/test/JS/JSTestSerializationInheritFinal.h: >+ * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp: >+ (WebCore::JSTestSerializedScriptValueInterface::heapSnapshot): >+ (WebCore::JSTestSerializedScriptValueInterfaceOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h: >+ * bindings/scripts/test/JS/JSTestStringifier.cpp: >+ (WebCore::JSTestStringifier::heapSnapshot): >+ (WebCore::JSTestStringifierOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifier.h: >+ * bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.cpp: >+ (WebCore::JSTestStringifierAnonymousOperation::heapSnapshot): >+ (WebCore::JSTestStringifierAnonymousOperationOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.h: >+ * bindings/scripts/test/JS/JSTestStringifierNamedOperation.cpp: >+ (WebCore::JSTestStringifierNamedOperation::heapSnapshot): >+ (WebCore::JSTestStringifierNamedOperationOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierNamedOperation.h: >+ * bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.cpp: >+ (WebCore::JSTestStringifierOperationImplementedAs::heapSnapshot): >+ (WebCore::JSTestStringifierOperationImplementedAsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.h: >+ * bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.cpp: >+ (WebCore::JSTestStringifierOperationNamedToString::heapSnapshot): >+ (WebCore::JSTestStringifierOperationNamedToStringOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.h: >+ * bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.cpp: >+ (WebCore::JSTestStringifierReadOnlyAttribute::heapSnapshot): >+ (WebCore::JSTestStringifierReadOnlyAttributeOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.h: >+ * bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.cpp: >+ (WebCore::JSTestStringifierReadWriteAttribute::heapSnapshot): >+ (WebCore::JSTestStringifierReadWriteAttributeOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.h: >+ * bindings/scripts/test/JS/JSTestTypedefs.cpp: >+ (WebCore::JSTestTypedefs::heapSnapshot): >+ (WebCore::JSTestTypedefsOwner::isReachableFromOpaqueRoots): >+ * bindings/scripts/test/JS/JSTestTypedefs.h: >+ * dom/Document.idl: >+ * html/DOMTokenList.idl: >+ * html/HTMLCollection.idl: >+ * page/DOMWindow.idl: >+ * page/mac/PageMac.mm: >+ (WebCore::Page::platformInitialize): >+ > 2018-06-04 Chris Dumez <cdumez@apple.com> > > Update Fetch code to provide more useful exception messages >diff --git a/Source/JavaScriptCore/API/JSAPIWrapperObject.mm b/Source/JavaScriptCore/API/JSAPIWrapperObject.mm >index 979ff9b9ed0af2170423ccf9452d1a9a6d0fefbd..8a84bf77b3e2dee1060696ba3717f5d6418cb0ac 100644 >--- a/Source/JavaScriptCore/API/JSAPIWrapperObject.mm >+++ b/Source/JavaScriptCore/API/JSAPIWrapperObject.mm >@@ -37,7 +37,7 @@ > class JSAPIWrapperObjectHandleOwner : public JSC::WeakHandleOwner { > public: > void finalize(JSC::Handle<JSC::Unknown>, void*) override; >- bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override; >+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**) override; > }; > > static JSAPIWrapperObjectHandleOwner* jsAPIWrapperObjectHandleOwner() >@@ -56,7 +56,7 @@ void JSAPIWrapperObjectHandleOwner::finalize(JSC::Handle<JSC::Unknown> handle, v > JSC::WeakSet::deallocate(JSC::WeakImpl::asWeakImpl(handle.slot())); > } > >-bool JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor) >+bool JSAPIWrapperObjectHandleOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor, const char**) > { > JSC::JSAPIWrapperObject* wrapperObject = JSC::jsCast<JSC::JSAPIWrapperObject*>(handle.get().asCell()); > // We use the JSGlobalObject when processing weak handles to prevent the situation where using >diff --git a/Source/JavaScriptCore/API/JSManagedValue.mm b/Source/JavaScriptCore/API/JSManagedValue.mm >index 099b04ac83ff2bf6290908625626d0b1d3b41854..497b6d2f8a6631fc1f0814245f32010f11346977 100644 >--- a/Source/JavaScriptCore/API/JSManagedValue.mm >+++ b/Source/JavaScriptCore/API/JSManagedValue.mm >@@ -43,7 +43,7 @@ > class JSManagedValueHandleOwner : public JSC::WeakHandleOwner { > public: > void finalize(JSC::Handle<JSC::Unknown>, void* context) override; >- bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override; >+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**) override; > }; > > static JSManagedValueHandleOwner& managedValueHandleOwner() >@@ -182,8 +182,10 @@ @interface JSManagedValue (PrivateMethods) > - (void)disconnectValue; > @end > >-bool JSManagedValueHandleOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor& visitor) >+bool JSManagedValueHandleOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "JSManagedValue is opaque root"; > JSManagedValue *managedValue = static_cast<JSManagedValue *>(context); > return visitor.containsOpaqueRoot(managedValue); > } >diff --git a/Source/JavaScriptCore/heap/ConservativeRoots.h b/Source/JavaScriptCore/heap/ConservativeRoots.h >index 0f9a42a6fcd694f0a9efeb10f32062246f96410d..83e5ce4694267c3143f08b44b0a861df450ce1a6 100644 >--- a/Source/JavaScriptCore/heap/ConservativeRoots.h >+++ b/Source/JavaScriptCore/heap/ConservativeRoots.h >@@ -41,7 +41,7 @@ public: > void add(void* begin, void* end); > void add(void* begin, void* end, JITStubRoutineSet&, CodeBlockSet&); > >- size_t size(); >+ size_t size() const; > HeapCell** roots(); > > private: >@@ -63,7 +63,7 @@ private: > HeapCell* m_inlineRoots[inlineCapacity]; > }; > >-inline size_t ConservativeRoots::size() >+inline size_t ConservativeRoots::size() const > { > return m_size; > } >diff --git a/Source/JavaScriptCore/heap/Heap.cpp b/Source/JavaScriptCore/heap/Heap.cpp >index 9c66bbc053e73bd66f452157474fc03659ba9a8f..57367c2701c24c8e8523a541eb61705599bd660e 100644 >--- a/Source/JavaScriptCore/heap/Heap.cpp >+++ b/Source/JavaScriptCore/heap/Heap.cpp >@@ -2642,11 +2642,15 @@ void Heap::addCoreConstraints() > > TimingScope preConvergenceTimingScope(*this, "Constraint: conservative scan"); > m_objectSpace.prepareForConservativeScan(); >+ > ConservativeRoots conservativeRoots(*this); > SuperSamplerScope superSamplerScope(false); >+ > gatherStackRoots(conservativeRoots); > gatherJSStackRoots(conservativeRoots); > gatherScratchBufferRoots(conservativeRoots); >+ >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::ConservativeScan); > slotVisitor.append(conservativeRoots); > > lastVersion = m_phaseVersion; >@@ -2656,27 +2660,38 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "Msr", "Misc Small Roots", > [this] (SlotVisitor& slotVisitor) { >+ > #if JSC_OBJC_API_ENABLED > scanExternalRememberedSet(*m_vm, slotVisitor); > #endif >- >- if (m_vm->smallStrings.needsToBeVisited(*m_collectionScope)) >+ if (m_vm->smallStrings.needsToBeVisited(*m_collectionScope)) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::StrongReferences); > m_vm->smallStrings.visitStrongReferences(slotVisitor); >+ } > >- for (auto& pair : m_protectedValues) >- slotVisitor.appendUnbarriered(pair.key); >+ { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::ProtectedValues); >+ for (auto& pair : m_protectedValues) >+ slotVisitor.appendUnbarriered(pair.key); >+ } > >- if (m_markListSet && m_markListSet->size()) >+ if (m_markListSet && m_markListSet->size()) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::ConservativeScan); > MarkedArgumentBuffer::markLists(slotVisitor, *m_markListSet); >- >- slotVisitor.appendUnbarriered(m_vm->exception()); >- slotVisitor.appendUnbarriered(m_vm->lastException()); >+ } >+ >+ { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::VMExceptions); >+ slotVisitor.appendUnbarriered(m_vm->exception()); >+ slotVisitor.appendUnbarriered(m_vm->lastException()); >+ } > }, > ConstraintVolatility::GreyedByExecution); > > m_constraintSet->add( > "Sh", "Strong Handles", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::StrongHandles); > m_handleSet.visitStrongHandles(slotVisitor); > }, > ConstraintVolatility::GreyedByExecution); >@@ -2684,6 +2699,8 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "D", "Debugger", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::Debugger); >+ > #if ENABLE(SAMPLING_PROFILER) > if (SamplingProfiler* samplingProfiler = m_vm->samplingProfiler()) { > LockHolder locker(samplingProfiler->getLock()); >@@ -2693,7 +2710,7 @@ void Heap::addCoreConstraints() > dataLog("Sampling Profiler data:\n", slotVisitor); > } > #endif // ENABLE(SAMPLING_PROFILER) >- >+ > if (m_vm->typeProfiler()) > m_vm->typeProfilerLog()->visit(slotVisitor); > >@@ -2704,6 +2721,7 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "Jsr", "JIT Stub Routines", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::JITStubRoutines); > m_jitStubRoutines->traceMarkedStubRoutines(slotVisitor); > }, > ConstraintVolatility::GreyedByExecution); >@@ -2711,6 +2729,7 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "Ws", "Weak Sets", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::WeakSets); > m_objectSpace.visitWeakSets(slotVisitor); > }, > ConstraintVolatility::GreyedByMarking); >@@ -2719,8 +2738,9 @@ void Heap::addCoreConstraints() > "O", "Output", > [] (SlotVisitor& slotVisitor) { > VM& vm = slotVisitor.vm(); >- >+ > auto callOutputConstraint = [] (SlotVisitor& slotVisitor, HeapCell* heapCell, HeapCell::Kind) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::Output); > VM& vm = slotVisitor.vm(); > JSCell* cell = static_cast<JSCell*>(heapCell); > cell->methodTable(vm)->visitOutputConstraints(cell, slotVisitor); >@@ -2740,6 +2760,8 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "Dw", "DFG Worklists", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::DFGWorkLists); >+ > for (unsigned i = DFG::numberOfWorklists(); i--;) > DFG::existingWorklistForIndex(i).visitWeakReferences(slotVisitor); > >@@ -2760,6 +2782,7 @@ void Heap::addCoreConstraints() > m_constraintSet->add( > "Cb", "CodeBlocks", > [this] (SlotVisitor& slotVisitor) { >+ SetRootMarkReasonScope rootScope(slotVisitor, SlotVisitor::RootMarkReason::CodeBlocks); > iterateExecutingAndCompilingCodeBlocksWithoutHoldingLocks( > [&] (CodeBlock* codeBlock) { > // Visit the CodeBlock as a constraint only if it's black. >diff --git a/Source/JavaScriptCore/heap/HeapSnapshotBuilder.cpp b/Source/JavaScriptCore/heap/HeapSnapshotBuilder.cpp >index 65f633facda2c785680a85e789f8aef489792643..2e062f291725b66629718616f000ab601841426f 100644 >--- a/Source/JavaScriptCore/heap/HeapSnapshotBuilder.cpp >+++ b/Source/JavaScriptCore/heap/HeapSnapshotBuilder.cpp >@@ -37,24 +37,28 @@ > #include <wtf/text/StringBuilder.h> > > namespace JSC { >- >-unsigned HeapSnapshotBuilder::nextAvailableObjectIdentifier = 1; >-unsigned HeapSnapshotBuilder::getNextObjectIdentifier() { return nextAvailableObjectIdentifier++; } >+ >+static const char* rootTypeToString(SlotVisitor::RootMarkReason); >+ >+NodeIdentifier HeapSnapshotBuilder::nextAvailableObjectIdentifier = 1; >+NodeIdentifier HeapSnapshotBuilder::getNextObjectIdentifier() { return nextAvailableObjectIdentifier++; } > void HeapSnapshotBuilder::resetNextAvailableObjectIdentifier() { HeapSnapshotBuilder::nextAvailableObjectIdentifier = 1; } > >-HeapSnapshotBuilder::HeapSnapshotBuilder(HeapProfiler& profiler) >+HeapSnapshotBuilder::HeapSnapshotBuilder(HeapProfiler& profiler, SnapshotType type) > : m_profiler(profiler) >+ , m_snapshotType(type) > { > } > >-HeapSnapshotBuilder::~HeapSnapshotBuilder() >-{ >-} >+HeapSnapshotBuilder::~HeapSnapshotBuilder() = default; > > void HeapSnapshotBuilder::buildSnapshot() > { >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) >+ m_profiler.clearSnapshots(); >+ > PreventCollectionScope preventCollectionScope(m_profiler.vm().heap); >- >+ > m_snapshot = std::make_unique<HeapSnapshot>(m_profiler.mostRecentSnapshot()); > { > m_profiler.setActiveSnapshotBuilder(this); >@@ -69,17 +73,18 @@ void HeapSnapshotBuilder::buildSnapshot() > void HeapSnapshotBuilder::appendNode(JSCell* cell) > { > ASSERT(m_profiler.activeSnapshotBuilder() == this); >+ > ASSERT(Heap::isMarked(cell)); > >- if (hasExistingNodeForCell(cell)) >+ NodeIdentifier identifier; >+ if (previousSnapshotHasNodeForCell(cell, identifier)) > return; > > std::lock_guard<Lock> lock(m_buildingNodeMutex); >- > m_snapshot->appendNode(HeapSnapshotNode(cell, getNextObjectIdentifier())); > } > >-void HeapSnapshotBuilder::appendEdge(JSCell* from, JSCell* to) >+void HeapSnapshotBuilder::appendEdge(JSCell* from, JSCell* to, SlotVisitor::RootMarkReason rootMarkReason) > { > ASSERT(m_profiler.activeSnapshotBuilder() == this); > ASSERT(to); >@@ -90,6 +95,15 @@ void HeapSnapshotBuilder::appendEdge(JSCell* from, JSCell* to) > > std::lock_guard<Lock> lock(m_buildingEdgeMutex); > >+ if (!from) { >+ if (rootMarkReason == SlotVisitor::RootMarkReason::None && m_snapshotType == SnapshotType::GCDebuggingSnapshot) >+ WTFLogAlways("Cell %p is a root but no root marking reason was supplied", to); >+ >+ m_rootData.ensure(to, [] () -> RootData { >+ return { }; >+ }).iterator->value.markReason = rootMarkReason; >+ } >+ > m_edges.append(HeapSnapshotEdge(from, to)); > } > >@@ -123,22 +137,43 @@ void HeapSnapshotBuilder::appendIndexEdge(JSCell* from, JSCell* to, uint32_t ind > m_edges.append(HeapSnapshotEdge(from, to, index)); > } > >-bool HeapSnapshotBuilder::hasExistingNodeForCell(JSCell* cell) >+void HeapSnapshotBuilder::setOpaqueRootReachabilityReasonForCell(JSCell* cell, const char* reason) >+{ >+ if (!reason || !*reason) >+ return; >+ >+ m_rootData.ensure(cell, [] () -> RootData { >+ return { }; >+ }).iterator->value.reachabilityFromOpaqueRootReasons = reason; >+} >+ >+void HeapSnapshotBuilder::setWrappedObjectForCell(JSCell* cell, void* wrappedPtr) >+{ >+ m_wrappedObjectPointers.set(cell, wrappedPtr); >+} >+ >+bool HeapSnapshotBuilder::previousSnapshotHasNodeForCell(JSCell* cell, NodeIdentifier& identifier) > { > if (!m_snapshot->previous()) > return false; > >- return !!m_snapshot->previous()->nodeForCell(cell); >-} >+ auto existingNode = m_snapshot->previous()->nodeForCell(cell); >+ if (existingNode) { >+ identifier = existingNode.value().identifier; >+ return true; >+ } > >+ return false; >+} > > // Heap Snapshot JSON Format: > // > // { > // "version": 1.0, >+// // [<address>, <labelIndex>, <wrappedEddress>] only present in GCDebuggingSnapshot-type snapshots > // "nodes": [ >-// <nodeId>, <sizeInBytes>, <nodeClassNameIndex>, <internal>, >-// <nodeId>, <sizeInBytes>, <nodeClassNameIndex>, <internal>, >+// <nodeId>, <sizeInBytes>, <nodeClassNameIndex>, <internal>, [<labelIndex>, <cellEddress>, <wrappedEddress>], >+// <nodeId>, <sizeInBytes>, <nodeClassNameIndex>, <internal>, [<labelIndex>, <cellEddress>, <wrappedEddress>], > // ... > // ], > // "nodeClassNames": [ >@@ -154,7 +189,16 @@ bool HeapSnapshotBuilder::hasExistingNodeForCell(JSCell* cell) > // ], > // "edgeNames": [ > // "propertyName", "variableName", ... >-// ] >+// ], >+// // Things below here are only present in GCDebuggingSnapshot-type snapshots >+// "roots" : [ >+// <nodeId>, <rootReasonIndex>, <reachabilityReasonIndex>, >+// <nodeId>, <rootReasonIndex>, <reachabilityReasonIndex>, >+// ... // <nodeId> may be repeated >+// ], >+// "labels" : [ >+// "foo", "bar", ... >+// ], > // } > // > // Notes: >@@ -172,6 +216,9 @@ bool HeapSnapshotBuilder::hasExistingNodeForCell(JSCell* cell) > // - for Internal edges this should be ignored (0). > // - for Index edges this is the index value. > // - for Property or Variable edges this is an index into the "edgeNames" list. >+// >+// <rootReasonIndex> >+// - index into the "labels" list. > > static uint8_t edgeTypeToNumber(EdgeType type) > { >@@ -194,24 +241,98 @@ static const char* edgeTypeToString(EdgeType type) > return "Internal"; > } > >+static const char* snapshotTypeToString(HeapSnapshotBuilder::SnapshotType type) >+{ >+ switch (type) { >+ case HeapSnapshotBuilder::SnapshotType::InspectorSnapshot: >+ return "Inspector"; >+ case HeapSnapshotBuilder::SnapshotType::GCDebuggingSnapshot: >+ return "GCDebugging"; >+ } >+ ASSERT_NOT_REACHED(); >+ return "Inspector"; >+} >+ >+static const char* rootTypeToString(SlotVisitor::RootMarkReason type) >+{ >+ switch (type) { >+ case SlotVisitor::RootMarkReason::None: >+ return "None"; >+ case SlotVisitor::RootMarkReason::ConservativeScan: >+ return "Conservative scan"; >+ case SlotVisitor::RootMarkReason::StrongReferences: >+ return "Strong references"; >+ case SlotVisitor::RootMarkReason::ProtectedValues: >+ return "Protected values"; >+ case SlotVisitor::RootMarkReason::MarkListSet: >+ return "Mark list set"; >+ case SlotVisitor::RootMarkReason::VMExceptions: >+ return "VM exceptions"; >+ case SlotVisitor::RootMarkReason::StrongHandles: >+ return "Strong handles"; >+ case SlotVisitor::RootMarkReason::Debugger: >+ return "Debugger"; >+ case SlotVisitor::RootMarkReason::JITStubRoutines: >+ return "JIT stub routines"; >+ case SlotVisitor::RootMarkReason::WeakSets: >+ return "Weak sets"; >+ case SlotVisitor::RootMarkReason::Output: >+ return "Output"; >+ case SlotVisitor::RootMarkReason::DFGWorkLists: >+ return "DFG work lists"; >+ case SlotVisitor::RootMarkReason::CodeBlocks: >+ return "Code blocks"; >+ case SlotVisitor::RootMarkReason::DOMGCOutput: >+ return "DOM GC output"; >+ } >+ ASSERT_NOT_REACHED(); >+ return "None"; >+} >+ > String HeapSnapshotBuilder::json() > { > return json([] (const HeapSnapshotNode&) { return true; }); > } > >+void HeapSnapshotBuilder::setLabelForCell(JSCell* cell, const String& label) >+{ >+ m_cellLabels.set(cell, label); >+} >+ >+String HeapSnapshotBuilder::descriptionForCell(JSCell *cell) const >+{ >+ if (cell->isString()) >+ return emptyString(); // FIXME: get part of string. >+ >+ VM& vm = m_profiler.vm(); >+ Structure* structure = cell->structure(vm); >+ >+ if (structure->classInfo()->isSubClassOf(Structure::info())) { >+ Structure* cellAsStructure = jsCast<Structure*>(cell); >+ return cellAsStructure->classInfo()->className; >+ } >+ >+ return emptyString(); >+} >+ > String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> allowNodeCallback) > { > VM& vm = m_profiler.vm(); > DeferGCForAWhile deferGC(vm.heap); > > // Build a node to identifier map of allowed nodes to use when serializing edges. >- HashMap<JSCell*, unsigned> allowedNodeIdentifiers; >+ HashMap<JSCell*, NodeIdentifier> allowedNodeIdentifiers; > > // Build a list of used class names. > HashMap<const char*, unsigned> classNameIndexes; > classNameIndexes.set("<root>", 0); > unsigned nextClassNameIndex = 1; > >+ // Build a list of labels (this is just a string table). >+ HashMap<String, unsigned> labelIndexes; >+ labelIndexes.set("", 0); >+ unsigned nextLabelIndex = 1; >+ > // Build a list of used edge names. > HashMap<UniquedStringImpl*, unsigned> edgeNameIndexes; > unsigned nextEdgeNameIndex = 0; >@@ -231,12 +352,42 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > unsigned classNameIndex = result.iterator->value; > > bool isInternal = false; >+ void* wrappedAddress = 0; >+ unsigned labelIndex = 0; > if (!node.cell->isString()) { > Structure* structure = node.cell->structure(vm); > isInternal = !structure || !structure->globalObject(); >+ >+ String nodeLabel; >+ auto it = m_cellLabels.find(node.cell); >+ if (it != m_cellLabels.end()) >+ nodeLabel = it->value; >+ >+ if (nodeLabel.isEmpty()) { >+ if (auto* object = jsDynamicCast<JSObject*>(vm, node.cell)) { >+ if (auto* function = jsDynamicCast<JSFunction*>(vm, object)) >+ nodeLabel = function->calculatedDisplayName(vm); >+ } >+ } >+ >+ String description = descriptionForCell(node.cell); >+ if (description.length()) { >+ if (nodeLabel.length()) >+ nodeLabel.append(' '); >+ nodeLabel.append(description); >+ } >+ >+ if (!nodeLabel.isEmpty() && m_snapshotType == SnapshotType::GCDebuggingSnapshot) { >+ auto result = labelIndexes.add(nodeLabel, nextLabelIndex); >+ if (result.isNewEntry) >+ nextLabelIndex++; >+ labelIndex = result.iterator->value; >+ } >+ >+ wrappedAddress = m_wrappedObjectPointers.get(node.cell); > } > >- // <nodeId>, <sizeInBytes>, <className>, <optionalInternalBoolean> >+ // <nodeId>, <sizeInBytes>, <nodeClassNameIndex>, <internal>, [<labelIndex>, <cellEddress>, <wrappedEddress>] > json.append(','); > json.appendNumber(node.identifier); > json.append(','); >@@ -245,6 +396,14 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > json.appendNumber(classNameIndex); > json.append(','); > json.append(isInternal ? '1' : '0'); >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) { >+ json.append(','); >+ json.appendNumber(labelIndex); >+ json.append(','); >+ json.append(String::format("\"%p\"", node.cell)); // FIXME: Should add StringBuilder::appendAddress(void*). >+ json.append(','); >+ json.append(String::format("\"%p\"", wrappedAddress)); >+ } > }; > > bool firstEdge = true; >@@ -285,11 +444,21 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > // version > json.appendLiteral("\"version\":1"); > >+ // type >+ json.append(','); >+ json.appendLiteral("\"type\":"); >+ json.appendQuotedJSONString(snapshotTypeToString(m_snapshotType)); >+ > // nodes > json.append(','); > json.appendLiteral("\"nodes\":"); > json.append('['); >- json.appendLiteral("0,0,0,0"); // <root> >+ // <root> >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) >+ json.appendLiteral("0,0,0,0,0,\"0x0\",\"0x0\""); >+ else >+ json.appendLiteral("0,0,0,0"); >+ > for (HeapSnapshot* snapshot = m_profiler.mostRecentSnapshot(); snapshot; snapshot = snapshot->previous()) { > for (auto& node : snapshot->m_nodes) > appendNodeJSON(node); >@@ -323,8 +492,11 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > edge.from.identifier = 0; > else { > auto fromLookup = allowedNodeIdentifiers.find(edge.from.cell); >- if (fromLookup == allowedNodeIdentifiers.end()) >+ if (fromLookup == allowedNodeIdentifiers.end()) { >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) >+ WTFLogAlways("Failed to find node for from-edge cell %p", edge.from.cell); > return true; >+ } > edge.from.identifier = fromLookup->value; > } > >@@ -332,13 +504,17 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > edge.to.identifier = 0; > else { > auto toLookup = allowedNodeIdentifiers.find(edge.to.cell); >- if (toLookup == allowedNodeIdentifiers.end()) >+ if (toLookup == allowedNodeIdentifiers.end()) { >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) >+ WTFLogAlways("Failed to find node for to-edge cell %p", edge.to.cell); > return true; >+ } > edge.to.identifier = toLookup->value; > } > > return false; > }); >+ > allowedNodeIdentifiers.clear(); > m_edges.shrinkToFit(); > >@@ -386,6 +562,73 @@ String HeapSnapshotBuilder::json(std::function<bool (const HeapSnapshotNode&)> a > orderedEdgeNames.clear(); > json.append(']'); > >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) { >+ json.append(','); >+ json.appendLiteral("\"roots\":"); >+ json.append('['); >+ >+ HeapSnapshot* snapshot = m_profiler.mostRecentSnapshot(); >+ >+ bool firstNode = true; >+ for (auto it : m_rootData) { >+ auto snapshotNode = snapshot->nodeForCell(it.key); >+ if (!snapshotNode) { >+ WTFLogAlways("Failed to find snapshot node for cell %p", it.key); >+ continue; >+ } >+ >+ if (!firstNode) >+ json.append(','); >+ >+ firstNode = false; >+ json.appendNumber(snapshotNode.value().identifier); >+ >+ // Maybe we should just always encode the root names. >+ const char* rootName = rootTypeToString(it.value.markReason); >+ auto result = labelIndexes.add(rootName, nextLabelIndex); >+ if (result.isNewEntry) >+ nextLabelIndex++; >+ unsigned labelIndex = result.iterator->value; >+ json.append(','); >+ json.appendNumber(labelIndex); >+ >+ unsigned reachabilityReasonIndex = 0; >+ if (it.value.reachabilityFromOpaqueRootReasons) { >+ auto result = labelIndexes.add(it.value.reachabilityFromOpaqueRootReasons, nextLabelIndex); >+ if (result.isNewEntry) >+ nextLabelIndex++; >+ reachabilityReasonIndex = result.iterator->value; >+ } >+ json.append(','); >+ json.appendNumber(reachabilityReasonIndex); >+ } >+ >+ json.append(']'); >+ } >+ >+ if (m_snapshotType == SnapshotType::GCDebuggingSnapshot) { >+ // internal node descriptions >+ json.append(','); >+ json.appendLiteral("\"labels\":"); >+ json.append('['); >+ >+ Vector<String> orderedLabels(labelIndexes.size()); >+ for (auto& entry : labelIndexes) >+ orderedLabels[entry.value] = entry.key; >+ labelIndexes.clear(); >+ bool firstLabel = true; >+ for (auto& label : orderedLabels) { >+ if (!firstLabel) >+ json.append(','); >+ >+ firstLabel = false; >+ json.appendQuotedJSONString(label); >+ } >+ orderedLabels.clear(); >+ >+ json.append(']'); >+ } >+ > json.append('}'); > return json.toString(); > } >diff --git a/Source/JavaScriptCore/heap/HeapSnapshotBuilder.h b/Source/JavaScriptCore/heap/HeapSnapshotBuilder.h >index 0ed85d19f48e74a38b466917a2da530da4c13cb2..f9eab407692eb531971418c0fbfdb7dc93baf78c 100644 >--- a/Source/JavaScriptCore/heap/HeapSnapshotBuilder.h >+++ b/Source/JavaScriptCore/heap/HeapSnapshotBuilder.h >@@ -25,6 +25,7 @@ > > #pragma once > >+#include "SlotVisitor.h" > #include <functional> > #include <wtf/Lock.h> > #include <wtf/Vector.h> >@@ -33,10 +34,13 @@ > > namespace JSC { > >+class ConservativeRoots; > class HeapProfiler; > class HeapSnapshot; > class JSCell; > >+typedef unsigned NodeIdentifier; >+ > struct HeapSnapshotNode { > HeapSnapshotNode(JSCell* cell, unsigned identifier) > : cell(cell) >@@ -44,7 +48,7 @@ struct HeapSnapshotNode { > { } > > JSCell* cell; >- unsigned identifier; >+ NodeIdentifier identifier; > }; > > enum class EdgeType : uint8_t { >@@ -82,12 +86,12 @@ struct HeapSnapshotEdge { > > union { > JSCell *cell; >- unsigned identifier; >+ NodeIdentifier identifier; > } from; > > union { > JSCell *cell; >- unsigned identifier; >+ NodeIdentifier identifier; > } to; > > union { >@@ -101,33 +105,47 @@ struct HeapSnapshotEdge { > class JS_EXPORT_PRIVATE HeapSnapshotBuilder { > WTF_MAKE_FAST_ALLOCATED; > public: >- HeapSnapshotBuilder(HeapProfiler&); >+ enum SnapshotType { InspectorSnapshot, GCDebuggingSnapshot }; >+ >+ HeapSnapshotBuilder(HeapProfiler&, SnapshotType = SnapshotType::InspectorSnapshot); > ~HeapSnapshotBuilder(); > >- static unsigned nextAvailableObjectIdentifier; >- static unsigned getNextObjectIdentifier(); > static void resetNextAvailableObjectIdentifier(); > > // Performs a garbage collection that builds a snapshot of all live cells. > void buildSnapshot(); > >- // A marked cell. >+ // A root or marked cell. > void appendNode(JSCell*); > > // A reference from one cell to another. >- void appendEdge(JSCell* from, JSCell* to); >+ void appendEdge(JSCell* from, JSCell* to, SlotVisitor::RootMarkReason); > void appendPropertyNameEdge(JSCell* from, JSCell* to, UniquedStringImpl* propertyName); > void appendVariableNameEdge(JSCell* from, JSCell* to, UniquedStringImpl* variableName); > void appendIndexEdge(JSCell* from, JSCell* to, uint32_t index); > >+ void setOpaqueRootReachabilityReasonForCell(JSCell*, const char*); >+ void setWrappedObjectForCell(JSCell*, void*); >+ void setLabelForCell(JSCell*, const String&); >+ > String json(); > String json(std::function<bool (const HeapSnapshotNode&)> allowNodeCallback); > > private: >+ static NodeIdentifier nextAvailableObjectIdentifier; >+ static NodeIdentifier getNextObjectIdentifier(); >+ > // Finalized snapshots are not modified during building. So searching them > // for an existing node can be done concurrently without a lock. >- bool hasExistingNodeForCell(JSCell*); >- >+ bool previousSnapshotHasNodeForCell(JSCell*, NodeIdentifier&); >+ >+ String descriptionForCell(JSCell*) const; >+ >+ struct RootData { >+ const char* reachabilityFromOpaqueRootReasons { nullptr }; >+ SlotVisitor::RootMarkReason markReason { SlotVisitor::RootMarkReason::None }; >+ }; >+ > HeapProfiler& m_profiler; > > // SlotVisitors run in parallel. >@@ -135,6 +153,10 @@ private: > std::unique_ptr<HeapSnapshot> m_snapshot; > Lock m_buildingEdgeMutex; > Vector<HeapSnapshotEdge> m_edges; >+ HashMap<JSCell*, RootData> m_rootData; >+ HashMap<JSCell*, void*> m_wrappedObjectPointers; >+ HashMap<JSCell*, String> m_cellLabels; >+ SnapshotType m_snapshotType; > }; > > } // namespace JSC >diff --git a/Source/JavaScriptCore/heap/SlotVisitor.cpp b/Source/JavaScriptCore/heap/SlotVisitor.cpp >index b89686e545a8e70b289d1b421868e9a82dfd7060..778511055e4a203bbf8e086c153ba82734d7dedc 100644 >--- a/Source/JavaScriptCore/heap/SlotVisitor.cpp >+++ b/Source/JavaScriptCore/heap/SlotVisitor.cpp >@@ -224,7 +224,7 @@ void SlotVisitor::appendJSCellOrAuxiliary(HeapCell* heapCell) > void SlotVisitor::appendSlow(JSCell* cell, Dependency dependency) > { > if (UNLIKELY(m_heapSnapshotBuilder)) >- m_heapSnapshotBuilder->appendEdge(m_currentCell, cell); >+ m_heapSnapshotBuilder->appendEdge(m_currentCell, cell, m_rootMarkReason); > > appendHiddenSlowImpl(cell, dependency); > } >diff --git a/Source/JavaScriptCore/heap/SlotVisitor.h b/Source/JavaScriptCore/heap/SlotVisitor.h >index e8a27743a6c63b12ad99773abd260d839ad31731..ee590efa057957a5998be1dc69aa3d051b73137c 100644 >--- a/Source/JavaScriptCore/heap/SlotVisitor.h >+++ b/Source/JavaScriptCore/heap/SlotVisitor.h >@@ -57,6 +57,23 @@ class SlotVisitor { > friend class Heap; > > public: >+ enum RootMarkReason { >+ None, >+ ConservativeScan, >+ StrongReferences, >+ ProtectedValues, >+ MarkListSet, >+ VMExceptions, >+ StrongHandles, >+ Debugger, >+ JITStubRoutines, >+ WeakSets, >+ Output, >+ DFGWorkLists, >+ CodeBlocks, >+ DOMGCOutput, >+ }; >+ > SlotVisitor(Heap&, CString codeName); > ~SlotVisitor(); > >@@ -142,7 +159,11 @@ public: > void dump(PrintStream&) const; > > bool isBuildingHeapSnapshot() const { return !!m_heapSnapshotBuilder; } >+ HeapSnapshotBuilder* heapSnapshotBuilder() const { return m_heapSnapshotBuilder; } > >+ RootMarkReason rootMarkReason() const { return m_rootMarkReason; } >+ void setRootMarkReason(RootMarkReason reason) { m_rootMarkReason = reason; } >+ > HeapVersion markingVersion() const { return m_markingVersion; } > > bool mutatorIsStopped() const { return m_mutatorIsStopped; } >@@ -224,6 +245,7 @@ private: > > HeapSnapshotBuilder* m_heapSnapshotBuilder { nullptr }; > JSCell* m_currentCell { nullptr }; >+ RootMarkReason m_rootMarkReason { RootMarkReason::None }; > bool m_isFirstVisit { false }; > bool m_mutatorIsStopped { false }; > bool m_canOptimizeForStoppedMutator { false }; >@@ -262,4 +284,23 @@ private: > SlotVisitor& m_stack; > }; > >+class SetRootMarkReasonScope { >+public: >+ SetRootMarkReasonScope(SlotVisitor& visitor, SlotVisitor::RootMarkReason reason) >+ : m_visitor(visitor) >+ , m_previousReason(visitor.rootMarkReason()) >+ { >+ m_visitor.setRootMarkReason(reason); >+ } >+ >+ ~SetRootMarkReasonScope() >+ { >+ m_visitor.setRootMarkReason(m_previousReason); >+ } >+ >+private: >+ SlotVisitor& m_visitor; >+ SlotVisitor::RootMarkReason m_previousReason; >+}; >+ > } // namespace JSC >diff --git a/Source/JavaScriptCore/heap/WeakBlock.cpp b/Source/JavaScriptCore/heap/WeakBlock.cpp >index f328f96c451a5153b89d5b3c4ae424880675f0c3..323ce6ffac688ae14b10dc84c85d122df021fba8 100644 >--- a/Source/JavaScriptCore/heap/WeakBlock.cpp >+++ b/Source/JavaScriptCore/heap/WeakBlock.cpp >@@ -28,6 +28,7 @@ > > #include "CellContainerInlines.h" > #include "Heap.h" >+#include "HeapSnapshotBuilder.h" > #include "JSCInlines.h" > #include "JSObject.h" > #include "WeakHandleOwner.h" >@@ -114,10 +115,20 @@ void WeakBlock::specializedVisit(ContainerType& container, SlotVisitor& visitor) > if (container.isMarked(markingVersion, jsValue.asCell())) > continue; > >- if (!weakHandleOwner->isReachableFromOpaqueRoots(Handle<Unknown>::wrapSlot(&const_cast<JSValue&>(jsValue)), weakImpl->context(), visitor)) >+ const char* reason = ""; >+ const char** reasonPtr = nullptr; >+ if (UNLIKELY(visitor.isBuildingHeapSnapshot())) >+ reasonPtr = &reason; >+ >+ if (!weakHandleOwner->isReachableFromOpaqueRoots(Handle<Unknown>::wrapSlot(&const_cast<JSValue&>(jsValue)), weakImpl->context(), visitor, reasonPtr)) > continue; > > visitor.appendUnbarriered(jsValue); >+ >+ if (UNLIKELY(visitor.isBuildingHeapSnapshot())) { >+ if (jsValue.isCell()) >+ visitor.heapSnapshotBuilder()->setOpaqueRootReachabilityReasonForCell(jsValue.asCell(), *reasonPtr); >+ } > } > } > >diff --git a/Source/JavaScriptCore/heap/WeakHandleOwner.cpp b/Source/JavaScriptCore/heap/WeakHandleOwner.cpp >index 044518f7a31307cf366c18fa3b2e67fde805fe1c..4572405977f5971a17775de4b9e41ad6c4e27ad1 100644 >--- a/Source/JavaScriptCore/heap/WeakHandleOwner.cpp >+++ b/Source/JavaScriptCore/heap/WeakHandleOwner.cpp >@@ -37,7 +37,7 @@ WeakHandleOwner::~WeakHandleOwner() > { > } > >-bool WeakHandleOwner::isReachableFromOpaqueRoots(Handle<Unknown>, void*, SlotVisitor&) >+bool WeakHandleOwner::isReachableFromOpaqueRoots(Handle<Unknown>, void*, SlotVisitor&, const char**) > { > return false; > } >diff --git a/Source/JavaScriptCore/heap/WeakHandleOwner.h b/Source/JavaScriptCore/heap/WeakHandleOwner.h >index 219a9c59189dd1413e4ea6e724d7da1a36505db1..450456f40169a7a45640b5e6554768edd415e92f 100644 >--- a/Source/JavaScriptCore/heap/WeakHandleOwner.h >+++ b/Source/JavaScriptCore/heap/WeakHandleOwner.h >@@ -34,7 +34,8 @@ class SlotVisitor; > class JS_EXPORT_PRIVATE WeakHandleOwner { > public: > virtual ~WeakHandleOwner(); >- virtual bool isReachableFromOpaqueRoots(Handle<Unknown>, void* context, SlotVisitor&); >+ // reason will only be non-null when generating a debug GC heap snapshot. >+ virtual bool isReachableFromOpaqueRoots(Handle<Unknown>, void* context, SlotVisitor&, char const** reason = nullptr); > virtual void finalize(Handle<Unknown>, void* context); > }; > >diff --git a/Source/JavaScriptCore/runtime/SimpleTypedArrayController.cpp b/Source/JavaScriptCore/runtime/SimpleTypedArrayController.cpp >index a25028cd752f83f7ad666783fe62bc9a510c7a36..6afe2309f14a21f38d33e31219bb5709322b9c0e 100644 >--- a/Source/JavaScriptCore/runtime/SimpleTypedArrayController.cpp >+++ b/Source/JavaScriptCore/runtime/SimpleTypedArrayController.cpp >@@ -58,8 +58,10 @@ bool SimpleTypedArrayController::isAtomicsWaitAllowedOnCurrentThread() > return true; > } > >-bool SimpleTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor) >+bool SimpleTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "JSArrayBuffer is opaque root"; > auto& wrapper = *JSC::jsCast<JSC::JSArrayBuffer*>(handle.slot()->asCell()); > return visitor.containsOpaqueRoot(wrapper.impl()); > } >diff --git a/Source/JavaScriptCore/runtime/SimpleTypedArrayController.h b/Source/JavaScriptCore/runtime/SimpleTypedArrayController.h >index d2b03c2639590d37ecd12c6a998d3569bae279a6..33d089f617bd88cbe4df81c411bdf4e40c77d510 100644 >--- a/Source/JavaScriptCore/runtime/SimpleTypedArrayController.h >+++ b/Source/JavaScriptCore/runtime/SimpleTypedArrayController.h >@@ -58,7 +58,7 @@ public: > private: > class JSArrayBufferOwner : public WeakHandleOwner { > public: >- bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, SlotVisitor&) override; >+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, SlotVisitor&, const char** reason) override; > void finalize(JSC::Handle<JSC::Unknown>, void* context) override; > }; > >diff --git a/Source/JavaScriptCore/tools/JSDollarVM.cpp b/Source/JavaScriptCore/tools/JSDollarVM.cpp >index 8d75484465f5561cdc77eed0fd59b4dc51d7ffaa..bfc2a987428a775b9ae29189fecf05d24e8eec2d 100644 >--- a/Source/JavaScriptCore/tools/JSDollarVM.cpp >+++ b/Source/JavaScriptCore/tools/JSDollarVM.cpp >@@ -104,8 +104,10 @@ private: > > class ElementHandleOwner : public WeakHandleOwner { > public: >- bool isReachableFromOpaqueRoots(Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) override >+ bool isReachableFromOpaqueRoots(Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) override > { >+ if (UNLIKELY(reason)) >+ *reason = "JSC::Element is opaque root"; > Element* element = jsCast<Element*>(handle.slot()->asCell()); > return visitor.containsOpaqueRoot(element->root()); > } >diff --git a/Source/WebCore/Sources.txt b/Source/WebCore/Sources.txt >index 8b02601cb890da9fc4e1d0b9b7d8c34a590e29f3..e533cb8783e8cc6fb173156f281f5f564df0a85b 100644 >--- a/Source/WebCore/Sources.txt >+++ b/Source/WebCore/Sources.txt >@@ -369,6 +369,7 @@ bindings/js/JSDOMConvertNumbers.cpp > bindings/js/JSDOMConvertStrings.cpp > bindings/js/JSDOMConvertWebGL.cpp > bindings/js/JSDOMIterator.cpp >+bindings/js/JSDOMTokenListCustom.cpp > bindings/js/JSDeprecatedCSSOMValueCustom.cpp > bindings/js/JSCallbackData.cpp > bindings/js/JSCanvasRenderingContext2DCustom.cpp >diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >index 1673aa9a530ca3d2e91685fa1c4051a2ee5910db..528a84c9c0ccf20316bfe8a4e1a1d00b58f1f9f5 100644 >--- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj >+++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj >@@ -5603,6 +5603,7 @@ > 0F4966A71DB40C4300A274BB /* JSDOMPointInit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMPointInit.h; sourceTree = "<group>"; }; > 0F4966A81DB40C4300A274BB /* JSDOMPointReadOnly.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMPointReadOnly.cpp; sourceTree = "<group>"; }; > 0F4966A91DB40C4300A274BB /* JSDOMPointReadOnly.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDOMPointReadOnly.h; sourceTree = "<group>"; }; >+ 0F4A6F9820C1C3F2006720D1 /* JSDOMTokenListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDOMTokenListCustom.cpp; sourceTree = "<group>"; }; > 0F4E57161313276200CF85AF /* RenderSVGAllInOne.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGAllInOne.cpp; sourceTree = "<group>"; }; > 0F54DCE31881051D003EEDBB /* TextAutoSizing.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextAutoSizing.cpp; sourceTree = "<group>"; }; > 0F54DCE41881051D003EEDBB /* TextAutoSizing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextAutoSizing.h; sourceTree = "<group>"; }; >@@ -19780,6 +19781,7 @@ > ADDA94BF19686F8000453029 /* JSDocumentCustom.h */, > 7C33F3601B4A050400502CAF /* JSDocumentFragmentCustom.cpp */, > 0F94A3951EF1B10500FBAFFB /* JSDOMQuadCustom.cpp */, >+ 0F4A6F9820C1C3F2006720D1 /* JSDOMTokenListCustom.cpp */, > BC2ED5540C6B9BD300920BFF /* JSElementCustom.cpp */, > ADEC78F718EE5308001315C2 /* JSElementCustom.h */, > BCEFAF4D0C317E6900FA81F6 /* JSEventCustom.cpp */, >diff --git a/Source/WebCore/bindings/js/DOMGCOutputConstraint.cpp b/Source/WebCore/bindings/js/DOMGCOutputConstraint.cpp >index 6886343a77534848d4b59c34eff65bfed7c7cf25..7d27da466b85c5d5c9a15b7391c13f9652c7c8d4 100644 >--- a/Source/WebCore/bindings/js/DOMGCOutputConstraint.cpp >+++ b/Source/WebCore/bindings/js/DOMGCOutputConstraint.cpp >@@ -29,6 +29,7 @@ > #include "WebCoreJSClientData.h" > #include <JavaScriptCore/BlockDirectoryInlines.h> > #include <JavaScriptCore/HeapInlines.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/MarkedBlockInlines.h> > #include <JavaScriptCore/SubspaceInlines.h> > #include <JavaScriptCore/VM.h> >@@ -61,6 +62,7 @@ void DOMGCOutputConstraint::executeImpl(SlotVisitor& visitor) > m_clientData.forEachOutputConstraintSpace( > [&] (Subspace& subspace) { > auto func = [] (SlotVisitor& visitor, HeapCell* heapCell, HeapCell::Kind) { >+ SetRootMarkReasonScope rootScope(visitor, SlotVisitor::RootMarkReason::DOMGCOutput); > JSCell* cell = static_cast<JSCell*>(heapCell); > cell->methodTable(visitor.vm())->visitOutputConstraints(cell, visitor); > }; >diff --git a/Source/WebCore/bindings/js/GCController.cpp b/Source/WebCore/bindings/js/GCController.cpp >index 43856f5ee5cafc23f563d5fc765499a6f6ac21e5..8c4646cf2f3a1d07a30f638c8c566d4e1543be90 100644 >--- a/Source/WebCore/bindings/js/GCController.cpp >+++ b/Source/WebCore/bindings/js/GCController.cpp >@@ -27,9 +27,14 @@ > #include "GCController.h" > > #include "CommonVM.h" >+#include "FileSystem.h" >+#include "JSHTMLDocument.h" >+#include "Location.h" > #include <JavaScriptCore/Heap.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSLock.h> > #include <JavaScriptCore/VM.h> >+#include <pal/Logging.h> > #include <wtf/FastMalloc.h> > #include <wtf/NeverDestroyed.h> > #include <wtf/StdLibExtras.h> >@@ -52,6 +57,12 @@ GCController& GCController::singleton() > GCController::GCController() > : m_GCTimer(*this, &GCController::gcTimerFired) > { >+ static std::once_flag onceFlag; >+ std::call_once(onceFlag, [] { >+ PAL::registerNotifyCallback("com.apple.WebKit.dumpGCHeap", [] { >+ GCController::singleton().dumpHeap(); >+ }); >+ }); > } > > void GCController::garbageCollectSoon() >@@ -127,4 +138,36 @@ void GCController::deleteAllLinkedCode(DeleteAllCodeEffort effort) > commonVM().deleteAllLinkedCode(effort); > } > >+void GCController::dumpHeap() >+{ >+ FileSystem::PlatformFileHandle fileHandle; >+ String tempFilePath = FileSystem::openTemporaryFile(ASCIILiteral("GCHeap"), fileHandle); >+ if (!FileSystem::isHandleValid(fileHandle)) { >+ WTFLogAlways("Dumping GC heap failed to open temporary file"); >+ return; >+ } >+ >+ VM& vm = commonVM(); >+ JSLockHolder lock(vm); >+ >+ sanitizeStackForVM(&vm); >+ >+ String jsonData; >+ { >+ DeferGCForAWhile deferGC(vm.heap); >+ >+ HeapSnapshotBuilder snapshotBuilder(vm.ensureHeapProfiler(), HeapSnapshotBuilder::SnapshotType::GCDebuggingSnapshot); >+ snapshotBuilder.buildSnapshot(); >+ >+ jsonData = snapshotBuilder.json(); >+ } >+ >+ CString utf8String = jsonData.utf8(); >+ >+ FileSystem::writeToFile(fileHandle, utf8String.data(), utf8String.length()); >+ FileSystem::closeFile(fileHandle); >+ >+ WTFLogAlways("Dumped GC heap to %s", tempFilePath.utf8().data()); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/bindings/js/GCController.h b/Source/WebCore/bindings/js/GCController.h >index ef6d1386f72d50819031a6c1d32438afde90f8f1..0ce45950c5391f60696fd40d89d927da386a87d3 100644 >--- a/Source/WebCore/bindings/js/GCController.h >+++ b/Source/WebCore/bindings/js/GCController.h >@@ -51,6 +51,8 @@ public: > private: > GCController(); // Use singleton() instead. > >+ void dumpHeap(); >+ > void gcTimerFired(); > Timer m_GCTimer; > }; >diff --git a/Source/WebCore/bindings/js/JSCSSRuleListCustom.cpp b/Source/WebCore/bindings/js/JSCSSRuleListCustom.cpp >index f0550aa6443ee9d44655b95c09720e462dcd7bfe..020e458c05fb350d0351d04dc175e11935067cba 100644 >--- a/Source/WebCore/bindings/js/JSCSSRuleListCustom.cpp >+++ b/Source/WebCore/bindings/js/JSCSSRuleListCustom.cpp >@@ -36,15 +36,25 @@ > namespace WebCore { > using namespace JSC; > >-bool JSCSSRuleListOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSCSSRuleListOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > JSCSSRuleList* jsCSSRuleList = jsCast<JSCSSRuleList*>(handle.slot()->asCell()); > if (!jsCSSRuleList->hasCustomProperties(*jsCSSRuleList->vm())) > return false; >- if (CSSStyleSheet* styleSheet = jsCSSRuleList->wrapped().styleSheet()) >+ >+ if (CSSStyleSheet* styleSheet = jsCSSRuleList->wrapped().styleSheet()) { >+ if (UNLIKELY(reason)) >+ *reason = "CSSStyleSheet is opaque root"; >+ > return visitor.containsOpaqueRoot(root(styleSheet)); >- if (CSSRule* cssRule = jsCSSRuleList->wrapped().item(0)) >+ } >+ >+ if (CSSRule* cssRule = jsCSSRuleList->wrapped().item(0)) { >+ if (UNLIKELY(reason)) >+ *reason = "CSSRule is opaque root"; >+ > return visitor.containsOpaqueRoot(root(cssRule)); >+ } > return false; > } > >diff --git a/Source/WebCore/bindings/js/JSCallbackData.cpp b/Source/WebCore/bindings/js/JSCallbackData.cpp >index 90a837eeaadd6774655b8635db81dbe2c15304b4..ee94099e6729d2f04fe2f4a760873d089e75bc13 100644 >--- a/Source/WebCore/bindings/js/JSCallbackData.cpp >+++ b/Source/WebCore/bindings/js/JSCallbackData.cpp >@@ -92,8 +92,10 @@ void JSCallbackDataWeak::visitJSFunction(JSC::SlotVisitor& vistor) > vistor.append(m_callback); > } > >-bool JSCallbackDataWeak::WeakOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, SlotVisitor& visitor) >+bool JSCallbackDataWeak::WeakOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "Context is opaque root"; // FIXME: what is the context. > return visitor.containsOpaqueRoot(context); > } > >diff --git a/Source/WebCore/bindings/js/JSCallbackData.h b/Source/WebCore/bindings/js/JSCallbackData.h >index 60192e61422d123a2297927b5bdaff03d447d765..a5bc9542e54752334af0d790305263e94fe5bdda 100644 >--- a/Source/WebCore/bindings/js/JSCallbackData.h >+++ b/Source/WebCore/bindings/js/JSCallbackData.h >@@ -116,7 +116,7 @@ public: > > private: > class WeakOwner : public JSC::WeakHandleOwner { >- bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override; >+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**) override; > }; > WeakOwner m_weakOwner; > JSC::Weak<JSC::JSObject> m_callback; >diff --git a/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp b/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp >index f1018f4d57dfb3b4256d171edb68fda183c480a8..4d500429807753580491facec170e6ba7770250f 100644 >--- a/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp >+++ b/Source/WebCore/bindings/js/JSCanvasRenderingContext2DCustom.cpp >@@ -22,8 +22,11 @@ > > namespace WebCore { > >-bool JSCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor) >+bool JSCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "Canvas is opaque root"; >+ > JSCanvasRenderingContext2D* jsCanvasRenderingContext = jsCast<JSCanvasRenderingContext2D*>(handle.slot()->asCell()); > void* root = WebCore::root(jsCanvasRenderingContext->wrapped().canvas()); > return visitor.containsOpaqueRoot(root); >diff --git a/Source/WebCore/bindings/js/JSDOMTokenListCustom.cpp b/Source/WebCore/bindings/js/JSDOMTokenListCustom.cpp >new file mode 100644 >index 0000000000000000000000000000000000000000..1804c5a0d966a99d97e0af0c4113e9568ebe497c >--- /dev/null >+++ b/Source/WebCore/bindings/js/JSDOMTokenListCustom.cpp >@@ -0,0 +1,45 @@ >+/* >+ * Copyright (C) 2018 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions >+ * are met: >+ * 1. Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * 2. Redistributions in binary form must reproduce the above copyright >+ * notice, this list of conditions and the following disclaimer in the >+ * documentation and/or other materials provided with the distribution. >+ * >+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY >+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE >+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR >+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR >+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, >+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, >+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR >+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY >+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+#include "config.h" >+#include "JSDOMTokenList.h" >+ >+#include "JSDOMBinding.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> >+ >+ >+namespace WebCore { >+using namespace JSC; >+ >+void JSDOMTokenList::heapSnapshot(JSCell* cell, JSC::HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSDOMTokenList*>(cell); >+ auto& wrapped = thisObject->wrapped(); >+ >+ builder.setLabelForCell(cell, String::format("doc %p", &wrapped.element().document())); >+ Base::heapSnapshot(cell, builder); >+} >+ >+} // namespace WebCore >diff --git a/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp b/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp >index 5db1d5ccbe1fe8b7fa29d39faadb38813beae8be..34c2f0e6612fe75c15498c4fc73087555f7d7910 100644 >--- a/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp >+++ b/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp >@@ -45,6 +45,7 @@ > #include "ScheduledAction.h" > #include "Settings.h" > #include "WebCoreJSClientData.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/Lookup.h> > >@@ -201,7 +202,7 @@ bool JSDOMWindow::getOwnPropertySlot(JSObject* object, ExecState* state, Propert > if (!BindingSecurity::shouldAllowAccessToDOMWindow(*state, thisObject->wrapped(), errorMessage)) > return jsDOMWindowGetOwnPropertySlotRestrictedAccess<DOMWindowType::Local>(thisObject, thisObject->wrapped(), *state, propertyName, slot, errorMessage); > >- // FIXME: this need more explanation. >+ // FIXME: this needs more explanation. > // (Particularly, is it correct that this exists here but not in getOwnPropertySlotByIndex?) > slot.setWatchpointSet(thisObject->m_windowCloseWatchpoints); > >@@ -327,6 +328,15 @@ bool JSDOMWindow::deletePropertyByIndex(JSCell* cell, ExecState* exec, unsigned > return Base::deletePropertyByIndex(thisObject, exec, propertyName); > } > >+void JSDOMWindow::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ JSDOMWindow* thisObject = jsCast<JSDOMWindow*>(cell); >+ if (auto* location = thisObject->wrapped().location()) >+ builder.setLabelForCell(cell, location->href()); >+ >+ Base::heapSnapshot(cell, builder); >+} >+ > // https://html.spec.whatwg.org/#crossoriginproperties-(-o-) > static void addCrossOriginWindowPropertyNames(ExecState& state, AbstractDOMWindow& window, PropertyNameArray& propertyNames) > { >diff --git a/Source/WebCore/bindings/js/JSDeprecatedCSSOMValueCustom.cpp b/Source/WebCore/bindings/js/JSDeprecatedCSSOMValueCustom.cpp >index 35c75fe347126421775609c4428cacf0a3cdf103..f86fee63c76b956b3f3c2bcc1d265fa87769559c 100644 >--- a/Source/WebCore/bindings/js/JSDeprecatedCSSOMValueCustom.cpp >+++ b/Source/WebCore/bindings/js/JSDeprecatedCSSOMValueCustom.cpp >@@ -35,11 +35,15 @@ > namespace WebCore { > using namespace JSC; > >-bool JSDeprecatedCSSOMValueOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSDeprecatedCSSOMValueOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > JSDeprecatedCSSOMValue* jsCSSValue = jsCast<JSDeprecatedCSSOMValue*>(handle.slot()->asCell()); > if (!jsCSSValue->hasCustomProperties(*jsCSSValue->vm())) > return false; >+ >+ if (UNLIKELY(reason)) >+ *reason = "CSSStyleDeclaration is opaque root"; >+ > return visitor.containsOpaqueRoot(root(&jsCSSValue->wrapped().owner())); > } > >diff --git a/Source/WebCore/bindings/js/JSDocumentCustom.cpp b/Source/WebCore/bindings/js/JSDocumentCustom.cpp >index 6605f1e7ff2f9576ff89fe70f1a348ee4c8bdf3c..a847625aa6d82fcce63f45a0469785373e2b888f 100644 >--- a/Source/WebCore/bindings/js/JSDocumentCustom.cpp >+++ b/Source/WebCore/bindings/js/JSDocumentCustom.cpp >@@ -26,6 +26,7 @@ > #include "JSXMLDocument.h" > #include "NodeTraversal.h" > #include "SVGDocument.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > > > namespace WebCore { >@@ -93,4 +94,11 @@ void JSDocument::visitAdditionalChildren(SlotVisitor& visitor) > visitor.addOpaqueRoot(static_cast<ScriptExecutionContext*>(&wrapped())); > } > >+void JSDocument::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSDocument*>(cell); >+ builder.setLabelForCell(cell, thisObject->wrapped().url().string()); >+ Base::heapSnapshot(cell, builder); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/bindings/js/JSHTMLCollectionCustom.cpp b/Source/WebCore/bindings/js/JSHTMLCollectionCustom.cpp >index 022112565815d898e79c5674863855ea5035a9e9..7c0e99f2bf65849c7975ff1fbe887d7c80cba81f 100644 >--- a/Source/WebCore/bindings/js/JSHTMLCollectionCustom.cpp >+++ b/Source/WebCore/bindings/js/JSHTMLCollectionCustom.cpp >@@ -24,7 +24,7 @@ > #include "JSHTMLAllCollection.h" > #include "JSHTMLFormControlsCollection.h" > #include "JSHTMLOptionsCollection.h" >- >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > > namespace WebCore { > using namespace JSC; >@@ -50,4 +50,13 @@ JSValue toJS(ExecState* state, JSDOMGlobalObject* globalObject, HTMLCollection& > return wrap(state, globalObject, collection); > } > >+void JSHTMLCollection::heapSnapshot(JSCell* cell, JSC::HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSHTMLCollection*>(cell); >+ auto& wrapped = thisObject->wrapped(); >+ >+ builder.setLabelForCell(cell, String::format("doc %p", &wrapped.ownerNode().document())); >+ Base::heapSnapshot(cell, builder); >+} >+ > } // namespace WebCore >diff --git a/Source/WebCore/bindings/js/JSMutationObserverCustom.cpp b/Source/WebCore/bindings/js/JSMutationObserverCustom.cpp >index 4ddef8afc87b01dc6a551d1b92dd2ff19430dbe3..195ad015cd599b4561ae5ea10fc09346674bf557 100644 >--- a/Source/WebCore/bindings/js/JSMutationObserverCustom.cpp >+++ b/Source/WebCore/bindings/js/JSMutationObserverCustom.cpp >@@ -44,11 +44,14 @@ void JSMutationObserver::visitAdditionalChildren(JSC::SlotVisitor& visitor) > wrapped().callback().visitJSFunction(visitor); > } > >-bool JSMutationObserverOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSMutationObserverOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char**reason) > { > for (auto* node : jsCast<JSMutationObserver*>(handle.slot()->asCell())->wrapped().observedNodes()) { >- if (visitor.containsOpaqueRoot(root(node))) >+ if (visitor.containsOpaqueRoot(root(node))) { >+ if (UNLIKELY(reason)) >+ *reason = "Reachable from observed nodes"; > return true; >+ } > } > return false; > } >diff --git a/Source/WebCore/bindings/js/JSNodeCustom.cpp b/Source/WebCore/bindings/js/JSNodeCustom.cpp >index 09a70f22e88cf1cb987ae7d7181cfe2595359422..c485e303d5a36e31105f83fd574d5c3117ab2490 100644 >--- a/Source/WebCore/bindings/js/JSNodeCustom.cpp >+++ b/Source/WebCore/bindings/js/JSNodeCustom.cpp >@@ -71,7 +71,7 @@ using namespace JSC; > > using namespace HTMLNames; > >-static inline bool isReachableFromDOM(Node* node, SlotVisitor& visitor) >+static inline bool isReachableFromDOM(Node* node, SlotVisitor& visitor, const char** reason) > { > if (!node->isConnected()) { > if (is<Element>(*node)) { >@@ -83,30 +83,42 @@ static inline bool isReachableFromDOM(Node* node, SlotVisitor& visitor) > // the element is destroyed, its load event will not fire. > // FIXME: The DOM should manage this issue without the help of JavaScript wrappers. > if (is<HTMLImageElement>(element)) { >- if (downcast<HTMLImageElement>(element).hasPendingActivity()) >+ if (downcast<HTMLImageElement>(element).hasPendingActivity()) { >+ if (UNLIKELY(reason)) >+ *reason = "Image element with pending activity"; > return true; >+ } > } > #if ENABLE(VIDEO) > else if (is<HTMLAudioElement>(element)) { >- if (!downcast<HTMLAudioElement>(element).paused()) >+ if (!downcast<HTMLAudioElement>(element).paused()) { >+ if (UNLIKELY(reason)) >+ *reason = "Audio element which is not paused"; > return true; >+ } > } > #endif > } > > // If a node is firing event listeners, its wrapper is observable because > // its wrapper is responsible for marking those event listeners. >- if (node->isFiringEventListeners()) >+ if (node->isFiringEventListeners()) { >+ if (UNLIKELY(reason)) >+ *reason = "Node which is firing event listeners"; > return true; >+ } > } > >+ if (UNLIKELY(reason)) >+ *reason = "Connected node"; >+ > return visitor.containsOpaqueRoot(root(node)); > } > >-bool JSNodeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSNodeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > JSNode* jsNode = jsCast<JSNode*>(handle.slot()->asCell()); >- return isReachableFromDOM(&jsNode->wrapped(), visitor); >+ return isReachableFromDOM(&jsNode->wrapped(), visitor, reason); > } > > JSScope* JSNode::pushEventHandlerScope(ExecState* exec, JSScope* node) const >diff --git a/Source/WebCore/bindings/js/JSNodeListCustom.cpp b/Source/WebCore/bindings/js/JSNodeListCustom.cpp >index 9a1c873446953e321fb8e5569c94f3481ccef8f8..7f6d9e72da50795fef35ffd62bd2688c5a10eaf2 100644 >--- a/Source/WebCore/bindings/js/JSNodeListCustom.cpp >+++ b/Source/WebCore/bindings/js/JSNodeListCustom.cpp >@@ -37,17 +37,32 @@ > namespace WebCore { > using namespace JSC; > >-bool JSNodeListOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSNodeListOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > JSNodeList* jsNodeList = jsCast<JSNodeList*>(handle.slot()->asCell()); > if (!jsNodeList->hasCustomProperties(*jsNodeList->vm())) > return false; >- if (jsNodeList->wrapped().isLiveNodeList()) >+ >+ if (jsNodeList->wrapped().isLiveNodeList()) { >+ if (UNLIKELY(reason)) >+ *reason = "LiveNodeList owner is opaque root"; >+ > return visitor.containsOpaqueRoot(root(static_cast<LiveNodeList&>(jsNodeList->wrapped()).ownerNode())); >- if (jsNodeList->wrapped().isChildNodeList()) >+ } >+ >+ if (jsNodeList->wrapped().isChildNodeList()) { >+ if (UNLIKELY(reason)) >+ *reason = "ChildNodeList owner is opaque root"; >+ > return visitor.containsOpaqueRoot(root(static_cast<ChildNodeList&>(jsNodeList->wrapped()).ownerNode())); >- if (jsNodeList->wrapped().isEmptyNodeList()) >+ } >+ >+ if (jsNodeList->wrapped().isEmptyNodeList()) { >+ if (UNLIKELY(reason)) >+ *reason = "EmptyNodeList owner is opaque root"; >+ > return visitor.containsOpaqueRoot(root(static_cast<EmptyNodeList&>(jsNodeList->wrapped()).ownerNode())); >+ } > return false; > } > >diff --git a/Source/WebCore/bindings/js/JSOffscreenCanvasRenderingContext2DCustom.cpp b/Source/WebCore/bindings/js/JSOffscreenCanvasRenderingContext2DCustom.cpp >index 33b08e78a2c2f76574ad8c52d230f6ca0774a529..34d7a099b36678753f54f5ddfc648974b27d4a7f 100644 >--- a/Source/WebCore/bindings/js/JSOffscreenCanvasRenderingContext2DCustom.cpp >+++ b/Source/WebCore/bindings/js/JSOffscreenCanvasRenderingContext2DCustom.cpp >@@ -28,8 +28,11 @@ inline void* root(OffscreenCanvas* canvas) > return canvas; > } > >-bool JSOffscreenCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSOffscreenCanvasRenderingContext2DOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "Canvas is opaque root"; >+ > JSOffscreenCanvasRenderingContext2D* jsOffscreenCanvasRenderingContext = jsCast<JSOffscreenCanvasRenderingContext2D*>(handle.slot()->asCell()); > void* root = WebCore::root(&jsOffscreenCanvasRenderingContext->wrapped().canvas()); > return visitor.containsOpaqueRoot(root); >diff --git a/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp b/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp >index c2944513f95e93d0b1aae2a7b50673d813e3a4e3..3c487952c3865a0770a47dabfcd5ce8fab5fd4dd 100644 >--- a/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp >+++ b/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp >@@ -38,20 +38,26 @@ > namespace WebCore { > using namespace JSC; > >-bool JSTextTrackCueOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+bool JSTextTrackCueOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > JSTextTrackCue* jsTextTrackCue = jsCast<JSTextTrackCue*>(handle.slot()->asCell()); > TextTrackCue& textTrackCue = jsTextTrackCue->wrapped(); > > // If the cue is firing event listeners, its wrapper is reachable because > // the wrapper is responsible for marking those event listeners. >- if (textTrackCue.isFiringEventListeners()) >+ if (textTrackCue.isFiringEventListeners()) { >+ if (UNLIKELY(reason)) >+ *reason = "TextTrackCue is firing event listeners"; > return true; >+ } > > // If the cue is not associated with a track, it is not reachable. > if (!textTrackCue.track()) > return false; > >+ if (UNLIKELY(reason)) >+ *reason = "TextTrack is an opaque root"; >+ > return visitor.containsOpaqueRoot(root(textTrackCue.track())); > } > >diff --git a/Source/WebCore/bindings/js/ScriptController.cpp b/Source/WebCore/bindings/js/ScriptController.cpp >index e9a3b69fedd1211f8959e5dd95d1b6cb039bba01..1bb944f60e2db34b2a6248d6453a35b99e5b4e0f 100644 >--- a/Source/WebCore/bindings/js/ScriptController.cpp >+++ b/Source/WebCore/bindings/js/ScriptController.cpp >@@ -23,6 +23,7 @@ > > #include "BridgeJSC.h" > #include "CachedScriptFetcher.h" >+#include "CommonVM.h" > #include "ContentSecurityPolicy.h" > #include "DocumentLoader.h" > #include "Event.h" >diff --git a/Source/WebCore/bindings/js/WebCoreTypedArrayController.cpp b/Source/WebCore/bindings/js/WebCoreTypedArrayController.cpp >index 84fb3c4f15a8c8380be35b15e61f8e76f5a972a2..20b5f98168dbde3a7f19069319335fa9a54adf5b 100644 >--- a/Source/WebCore/bindings/js/WebCoreTypedArrayController.cpp >+++ b/Source/WebCore/bindings/js/WebCoreTypedArrayController.cpp >@@ -53,8 +53,10 @@ bool WebCoreTypedArrayController::isAtomicsWaitAllowedOnCurrentThread() > return !isMainThread(); > } > >-bool WebCoreTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor) >+bool WebCoreTypedArrayController::JSArrayBufferOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, JSC::SlotVisitor& visitor, const char** reason) > { >+ if (UNLIKELY(reason)) >+ *reason = "ArrayBuffer is opaque root"; > auto& wrapper = *JSC::jsCast<JSC::JSArrayBuffer*>(handle.slot()->asCell()); > return visitor.containsOpaqueRoot(wrapper.impl()); > } >diff --git a/Source/WebCore/bindings/js/WebCoreTypedArrayController.h b/Source/WebCore/bindings/js/WebCoreTypedArrayController.h >index 25260122ebf1197edcf1274971961ef229344736..e0bb956b9944ba22bce97a29676cf81dd0a2b841 100644 >--- a/Source/WebCore/bindings/js/WebCoreTypedArrayController.h >+++ b/Source/WebCore/bindings/js/WebCoreTypedArrayController.h >@@ -48,7 +48,7 @@ public: > private: > class JSArrayBufferOwner : public JSC::WeakHandleOwner { > public: >- bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&) override; >+ bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**) override; > void finalize(JSC::Handle<JSC::Unknown>, void* context) override; > }; > >diff --git a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >index 910369d20744685dcebaa1364aacca6aee8270c9..b3dc04726692ebcf2ce727a7eee28a3fe2cdf4b4 100644 >--- a/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >+++ b/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm >@@ -2648,7 +2648,7 @@ sub GenerateHeader > if ($interface->extendedAttributes->{CustomPreventExtensions}) { > push(@headerContent, " static bool preventExtensions(JSC::JSObject*, JSC::ExecState*);\n"); > } >- >+ > if (InstanceNeedsEstimatedSize($interface)) { > push(@headerContent, " static size_t estimatedSize(JSCell*);\n"); > } >@@ -2749,6 +2749,10 @@ sub GenerateHeader > push(@headerContent, " template<typename> static JSC::CompleteSubspace* subspaceFor(JSC::VM& vm) { return $subspaceFunc(vm); }\n"); > } > } >+ >+ if (NeedsImplementationClass($interface)) { >+ push(@headerContent, " static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&);\n"); >+ } > > if ($numCustomAttributes > 0) { > push(@headerContent, "\n // Custom attributes\n"); >@@ -2858,7 +2862,7 @@ sub GenerateHeader > } > $headerIncludes{"<wtf/NeverDestroyed.h>"} = 1; > push(@headerContent, "public:\n"); >- push(@headerContent, " virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&);\n"); >+ push(@headerContent, " virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**);\n"); > push(@headerContent, " virtual void finalize(JSC::Handle<JSC::Unknown>, void* context);\n"); > push(@headerContent, "};\n"); > push(@headerContent, "\n"); >@@ -4512,6 +4516,16 @@ sub GenerateImplementation > push(@implContent, "}\n\n"); > } > >+ if (NeedsImplementationClass($interface) && !$interface->extendedAttributes->{CustomHeapSnapshot}) { >+ AddToImplIncludes("<JavaScriptCore/HeapSnapshotBuilder.h>"); >+ push(@implContent, "void ${className}::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder)\n"); >+ push(@implContent, "{\n"); >+ push(@implContent, " auto* thisObject = jsCast<${className}*>(cell);\n"); >+ push(@implContent, " builder.setWrappedObjectForCell(cell, &thisObject->wrapped());\n"); >+ push(@implContent, " Base::heapSnapshot(cell, builder);\n"); >+ push(@implContent, "}\n\n"); >+ } >+ > if ($indexedGetterOperation) { > $implIncludes{"URL.h"} = 1 if $indexedGetterOperation->type->name eq "DOMString"; > if ($interfaceName =~ /^HTML\w*Collection$/ or $interfaceName eq "RadioNodeList") { >@@ -4521,7 +4535,7 @@ sub GenerateImplementation > } > > if (ShouldGenerateWrapperOwnerCode($hasParent, $interface) && !GetCustomIsReachable($interface)) { >- push(@implContent, "bool JS${interfaceName}Owner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor)\n"); >+ push(@implContent, "bool JS${interfaceName}Owner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason)\n"); > push(@implContent, "{\n"); > # All ActiveDOMObjects implement hasPendingActivity(), but not all of them > # increment their C++ reference counts when hasPendingActivity() becomes >@@ -4534,23 +4548,29 @@ sub GenerateImplementation > if ($codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject")) { > push(@implContent, " auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n"); > $emittedJSCast = 1; >- push(@implContent, " if (js${interfaceName}->wrapped().hasPendingActivity())\n"); >+ push(@implContent, " if (js${interfaceName}->wrapped().hasPendingActivity()) {\n"); >+ push(@implContent, " if (UNLIKELY(reason))\n"); >+ push(@implContent, " *reason = \"ActiveDOMObject with pending activity\";\n"); > push(@implContent, " return true;\n"); >+ push(@implContent, " }\n"); > } > if ($codeGenerator->InheritsInterface($interface, "EventTarget")) { > if (!$emittedJSCast) { > push(@implContent, " auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n"); > $emittedJSCast = 1; > } >- push(@implContent, " if (js${interfaceName}->wrapped().isFiringEventListeners())\n"); >+ push(@implContent, " if (js${interfaceName}->wrapped().isFiringEventListeners()) {\n"); >+ push(@implContent, " if (UNLIKELY(reason))\n"); >+ push(@implContent, " *reason = \"EventTarget firing event listeners\";\n"); > push(@implContent, " return true;\n"); >+ push(@implContent, " }\n"); > } > if ($codeGenerator->InheritsInterface($interface, "Node")) { > if (!$emittedJSCast) { > push(@implContent, " auto* js${interfaceName} = jsCast<JS${interfaceName}*>(handle.slot()->asCell());\n"); > $emittedJSCast = 1; > } >- push(@implContent, " if (JSNodeOwner::isReachableFromOpaqueRoots(handle, 0, visitor))\n"); >+ push(@implContent, " if (JSNodeOwner::isReachableFromOpaqueRoots(handle, 0, visitor, reason))\n"); > push(@implContent, " return true;\n"); > } > if (GetGenerateIsReachable($interface)) { >@@ -4562,33 +4582,49 @@ sub GenerateImplementation > my $rootString; > if (GetGenerateIsReachable($interface) eq "Impl") { > $rootString = " ${implType}* root = &js${interfaceName}->wrapped();\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from ${interfaceName}\";\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplWebGLRenderingContext") { > $rootString = " WebGLRenderingContextBase* root = WTF::getPtr(js${interfaceName}->wrapped().context());\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from ${interfaceName}\";\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplFrame") { > $rootString = " Frame* root = WTF::getPtr(js${interfaceName}->wrapped().frame());\n"; > $rootString .= " if (!root)\n"; > $rootString .= " return false;\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from Frame\";\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplDocument") { > $rootString = " Document* root = WTF::getPtr(js${interfaceName}->wrapped().document());\n"; > $rootString .= " if (!root)\n"; > $rootString .= " return false;\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from Document\";\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplElementRoot") { > $implIncludes{"Element.h"} = 1; > $implIncludes{"JSNodeCustom.h"} = 1; > $rootString = " Element* element = WTF::getPtr(js${interfaceName}->wrapped().element());\n"; > $rootString .= " if (!element)\n"; > $rootString .= " return false;\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from ${interfaceName}Owner\";\n"; > $rootString .= " void* root = WebCore::root(element);\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplOwnerNodeRoot") { > $implIncludes{"Element.h"} = 1; > $implIncludes{"JSNodeCustom.h"} = 1; > $rootString = " void* root = WebCore::root(js${interfaceName}->wrapped().ownerNode());\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from ${interfaceName} ownerNode\";\n"; > } elsif (GetGenerateIsReachable($interface) eq "ImplScriptExecutionContext") { > $rootString = " ScriptExecutionContext* root = WTF::getPtr(js${interfaceName}->wrapped().scriptExecutionContext());\n"; > $rootString .= " if (!root)\n"; > $rootString .= " return false;\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from ScriptExecutionContext\";\n"; > } else { > $rootString = " void* root = WebCore::root(&js${interfaceName}->wrapped());\n"; >+ $rootString .= " if (UNLIKELY(reason))\n"; >+ $rootString .= " *reason = \"Reachable from js${interfaceName}\";\n"; > } > > push(@implContent, $rootString); >@@ -4598,6 +4634,7 @@ sub GenerateImplementation > push(@implContent, " UNUSED_PARAM(handle);\n"); > } > push(@implContent, " UNUSED_PARAM(visitor);\n"); >+ push(@implContent, " UNUSED_PARAM(reason);\n"); > push(@implContent, " return false;\n"); > } > push(@implContent, "}\n\n"); >diff --git a/Source/WebCore/bindings/scripts/IDLAttributes.json b/Source/WebCore/bindings/scripts/IDLAttributes.json >index 37d61e028ce2287f61cee9b2bc2900417c0a3739..3687bb0c1053b2961f797d4187539ef4f0111f6f 100644 >--- a/Source/WebCore/bindings/scripts/IDLAttributes.json >+++ b/Source/WebCore/bindings/scripts/IDLAttributes.json >@@ -118,6 +118,9 @@ > "CustomGetter": { > "contextsAllowed": ["attribute"] > }, >+ "CustomHeapSnapshot": { >+ "contextsAllowed": ["interface"] >+ }, > "CustomIndexedSetter": { > "contextsAllowed": ["interface"] > }, >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.cpp b/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.cpp >index 4bf546f98b04d4159e5d35c8c54f1cd00353739b..f910bb648b1c9fd6a97be095459a1564cd17bdc1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.cpp >@@ -26,6 +26,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -168,10 +169,18 @@ size_t JSInterfaceName::estimatedSize(JSCell* cell) > return Base::estimatedSize(thisObject) + thisObject->wrapped().memoryCost(); > } > >-bool JSInterfaceNameOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSInterfaceName::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSInterfaceName*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSInterfaceNameOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.h b/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.h >index a1231489faf282a359c174a0cb28b6563d6a706f..92bb6719ce32cd26673176bc71829ff99ef8130b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSInterfaceName.h >@@ -52,6 +52,7 @@ public: > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static void visitChildren(JSCell*, JSC::SlotVisitor&); > >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSInterfaceName(JSC::Structure*, JSDOMGlobalObject&, Ref<InterfaceName>&&); > >@@ -60,7 +61,7 @@ protected: > > class JSInterfaceNameOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSMapLike.cpp b/Source/WebCore/bindings/scripts/test/JS/JSMapLike.cpp >index 697889c411fcb3b9f4c1379381da1d6fabbe5339..79c9f8bde8e2d127ed45a48f9c1b4be47d770887 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSMapLike.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSMapLike.cpp >@@ -32,6 +32,7 @@ > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/BuiltinNames.h> > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -337,10 +338,18 @@ EncodedJSValue JSC_HOST_CALL jsMapLikePrototypeFunctionDelete(ExecState* state) > return IDLOperation<JSMapLike>::call<jsMapLikePrototypeFunctionDeleteBody>(*state, "delete"); > } > >-bool JSMapLikeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSMapLike::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSMapLike*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSMapLikeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSMapLike.h b/Source/WebCore/bindings/scripts/test/JS/JSMapLike.h >index d80402d84f6ccc98e4ee2d0f1e2c39842ee878f9..206cd2ef23f51ff266dd948f86b0104b8709c213 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSMapLike.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSMapLike.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSMapLike(JSC::Structure*, JSDOMGlobalObject&, Ref<MapLike>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSMapLikeOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.cpp b/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.cpp >index f343ee49beaa922045afb550634ef5c60bff1c71..cd7a5e3aabf17458e025b8d36e3c10f89d45fe1f 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.cpp >@@ -32,6 +32,7 @@ > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/BuiltinNames.h> > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -286,10 +287,18 @@ EncodedJSValue JSC_HOST_CALL jsReadOnlyMapLikePrototypeFunctionForEach(ExecState > return IDLOperation<JSReadOnlyMapLike>::call<jsReadOnlyMapLikePrototypeFunctionForEachBody>(*state, "forEach"); > } > >-bool JSReadOnlyMapLikeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSReadOnlyMapLike::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSReadOnlyMapLike*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSReadOnlyMapLikeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.h b/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.h >index e2dc79f3e43558e93e56a3503509321ffd25bb1d..b6fbb20bc7e71cfcd8518f4e5509678795a5e4d7 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSReadOnlyMapLike.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSReadOnlyMapLike(JSC::Structure*, JSDOMGlobalObject&, Ref<ReadOnlyMapLike>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSReadOnlyMapLikeOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp >index 5099f832b7f492481d2fb025c8c0f93f5377e76b..6578624715e4104d2f695b138cd7374a88718714 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.cpp >@@ -33,6 +33,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSNode.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -247,10 +248,18 @@ EncodedJSValue JSC_HOST_CALL jsTestActiveDOMObjectPrototypeFunctionPostMessage(E > return IDLOperation<JSTestActiveDOMObject>::call<jsTestActiveDOMObjectPrototypeFunctionPostMessageBody>(*state, "postMessage"); > } > >-bool JSTestActiveDOMObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestActiveDOMObject::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestActiveDOMObject*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestActiveDOMObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h b/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h >index 0dd833f749e050ac3ed85affb5baeba6dbd1ebe8..f224633ead1801b470da1bf05b29f02431f2abd2 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestActiveDOMObject.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::HasStaticPropertyTable | Base::StructureFlags; > protected: >@@ -59,7 +60,7 @@ protected: > > class JSTestActiveDOMObjectOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.cpp >index d5befde9e40f76af895d2f2ee31cf236771934ed..c4ce777525a83d7a41ebf2209f31a36a3d9e458b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.cpp >@@ -34,6 +34,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSTestCEReactionsStringifier.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -301,10 +302,18 @@ EncodedJSValue JSC_HOST_CALL jsTestCEReactionsPrototypeFunctionMethodWithCEReact > return IDLOperation<JSTestCEReactions>::call<jsTestCEReactionsPrototypeFunctionMethodWithCEReactionsBody>(*state, "methodWithCEReactions"); > } > >-bool JSTestCEReactionsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestCEReactions::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestCEReactions*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestCEReactionsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.h b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.h >index e7f801fcdc482ebc2ffebba8fd33c4a6f8f7b4bb..8ac99c9e8a54284e54fd285aec90cd385d9060c3 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactions.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestCEReactions(JSC::Structure*, JSDOMGlobalObject&, Ref<TestCEReactions>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestCEReactionsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.cpp >index 5bc50fb015ab0b98274ae4b9919fe445fa338290..c02b3972291dad9a69c07bd31e898fabcb96dec4 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.cpp >@@ -30,6 +30,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -221,10 +222,18 @@ EncodedJSValue JSC_HOST_CALL jsTestCEReactionsStringifierPrototypeFunctionToStri > return IDLOperation<JSTestCEReactionsStringifier>::call<jsTestCEReactionsStringifierPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestCEReactionsStringifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestCEReactionsStringifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestCEReactionsStringifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestCEReactionsStringifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.h >index 63b3e163139a6d8c6d6787ca5c85e1b0302daa4c..05c1edb3eb8873491d68fca571e2b8e4d3dd25d1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCEReactionsStringifier.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestCEReactionsStringifier(JSC::Structure*, JSDOMGlobalObject&, Ref<TestCEReactionsStringifier>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestCEReactionsStringifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.cpp >index a8156d0e7cd5f999a28d1e8ff656052d3f819edd..b5faa997088f0e3ca7061cdc053711d3d947831b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.cpp >@@ -37,6 +37,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSNode.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -520,10 +521,18 @@ EncodedJSValue JSC_HOST_CALL jsTestCallTracerPrototypeFunctionTestOperationWithD > return IDLOperation<JSTestCallTracer>::call<jsTestCallTracerPrototypeFunctionTestOperationWithDefaultVariantArgumentBody>(*state, "testOperationWithDefaultVariantArgument"); > } > >-bool JSTestCallTracerOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestCallTracer::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestCallTracer*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestCallTracerOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.h b/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.h >index dd75a17258aa3b8b339f6849e5fbc17c34195607..c7bca1f19f13dbdb9ee6c92d3971cb559f1ba41c 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCallTracer.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestCallTracer(JSC::Structure*, JSDOMGlobalObject&, Ref<TestCallTracer>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestCallTracerOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp >index 15e2e4005e5e5d9443b3e69ab0608fbf64236368..c9ce0f25e217c796395cbb7ef5b9cb04f46cc3bd 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.cpp >@@ -27,6 +27,7 @@ > #include "JSDOMWrapperCache.h" > #include "TestClassWithJSBuiltinConstructorBuiltins.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -160,10 +161,18 @@ bool setJSTestClassWithJSBuiltinConstructorConstructor(ExecState* state, Encoded > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestClassWithJSBuiltinConstructorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestClassWithJSBuiltinConstructor::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestClassWithJSBuiltinConstructor*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestClassWithJSBuiltinConstructorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h b/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h >index 061b23af23dac061bde16f509824061336512a79..166ee73b0fc8f83ca65f8dd34f23c0cdb27bb73f 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestClassWithJSBuiltinConstructor.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestClassWithJSBuiltinConstructor(JSC::Structure*, JSDOMGlobalObject&, Ref<TestClassWithJSBuiltinConstructor>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestClassWithJSBuiltinConstructorOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.cpp >index 31a0c19d2032c94ad88b3a257441a5dc9a2bdc3f..779d3b3f386e44e6e6c87d042b9d0c144ce133fe 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.cpp >@@ -26,6 +26,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -158,10 +159,18 @@ bool setJSTestCustomConstructorWithNoInterfaceObjectConstructor(ExecState* state > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestCustomConstructorWithNoInterfaceObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestCustomConstructorWithNoInterfaceObject::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestCustomConstructorWithNoInterfaceObject*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestCustomConstructorWithNoInterfaceObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h b/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h >index d3b2b05211ca482136839f6f36f5068687446e1d..4cde2e9bd02f385b6562a64574105376f6503451 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestCustomConstructorWithNoInterfaceObject.h >@@ -48,6 +48,7 @@ public: > return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info()); > } > >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestCustomConstructorWithNoInterfaceObject(JSC::Structure*, JSDOMGlobalObject&, Ref<TestCustomConstructorWithNoInterfaceObject>&&); > >@@ -56,7 +57,7 @@ protected: > > class JSTestCustomConstructorWithNoInterfaceObjectOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp >index ae2ac1a2a79ccadb3e8ec80e84ef31514a126d75..e81885d0d9018bcedc885bb7870de0772c571696 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp >@@ -41,6 +41,7 @@ > #include "JSElement.h" > #include "JSNodeList.h" > #include <JavaScriptCore/FrameTracers.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -1258,5 +1259,12 @@ JSC::EncodedJSValue JIT_OPERATION unsafeJsTestDOMJITPrototypeFunctionGetElements > return JSValue::encode(toJS<IDLInterface<NodeList>>(*state, *castedThis->globalObject(), impl.getElementsByName(WTFMove(elementName)))); > } > >+void JSTestDOMJIT::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestDOMJIT*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > > } >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.h b/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.h >index 0b781e62e3be2f21b389170dadf2ecd31ef01e20..35fb126ec4c6e9a518f8c8f41972016d484130ee 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestDOMJIT& wrapped() const > { > return static_cast<TestDOMJIT&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.cpp >index e963c6cb67a1a4797187eafba4e70f1afc3c35db..217f935dbe9a5871741ce0e6b4e835d88d378baf 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.cpp >@@ -32,6 +32,7 @@ > #include "Settings.h" > #include "WebCoreJSClientData.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -294,10 +295,18 @@ EncodedJSValue JSC_HOST_CALL jsTestEnabledBySettingPrototypeFunctionEnabledBySet > > #endif > >-bool JSTestEnabledBySettingOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestEnabledBySetting::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestEnabledBySetting*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestEnabledBySettingOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.h b/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.h >index 9ff37051e0a115f6b816dd6227a1e3409fe83ace..ca1ebb63eea784882233ae5a65e470260f9cf2a3 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEnabledBySetting.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::HasStaticPropertyTable | Base::StructureFlags; > protected: >@@ -59,7 +60,7 @@ protected: > > class JSTestEnabledBySettingOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp >index 375228cb5485148be61c2a2150f5fd27323d27ae..5fa6ab411a635b2ea33439ea4959f493f105bbe1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMConvertStrings.h" > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -303,6 +304,13 @@ EncodedJSValue jsTestEventConstructorAttr3(ExecState* state, EncodedJSValue this > > #endif > >+void JSTestEventConstructor::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestEventConstructor*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > #if ENABLE(BINDING_INTEGRITY) > #if PLATFORM(WIN) > #pragma warning(disable: 4483) >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h b/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h >index e104cedd7f9818acee1990f0a70b4a7817d6fb43..9755360e26a8c1748ef8de0a95ca1f0dc7858832 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEventConstructor.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestEventConstructor& wrapped() const > { > return static_cast<TestEventConstructor&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp >index 8b62306a759596fcd832e32c8daeb450498e0a16..f2f8dc6a83487f51d0fe4534c6a3b363f3ce42fa 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.cpp >@@ -31,6 +31,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include "JSNode.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -246,6 +247,13 @@ EncodedJSValue JSC_HOST_CALL jsTestEventTargetPrototypeFunctionItem(ExecState* s > return IDLOperation<JSTestEventTarget>::call<jsTestEventTargetPrototypeFunctionItemBody>(*state, "item"); > } > >+void JSTestEventTarget::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestEventTarget*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > #if ENABLE(BINDING_INTEGRITY) > #if PLATFORM(WIN) > #pragma warning(disable: 4483) >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h b/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h >index 9ac22200d88b39e04256f24479c5f777f18eebda..eb863955e5c49ff99a0451050f74d46f1124992f 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestEventTarget.h >@@ -53,6 +53,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestEventTarget& wrapped() const > { > return static_cast<TestEventTarget&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp >index efe3174c4549b8d728e1b8a9fc80805d8677a8f8..1b0a4150beef7066b79c79d6374ab8f97f7dfb6a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestException.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -177,10 +178,18 @@ EncodedJSValue jsTestExceptionName(ExecState* state, EncodedJSValue thisValue, P > return IDLAttribute<JSTestException>::get<jsTestExceptionNameGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "name"); > } > >-bool JSTestExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestException::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestException*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestException.h b/Source/WebCore/bindings/scripts/test/JS/JSTestException.h >index 59c8d4c2af7d19a61972bb7b1c59175bcb8c9715..ab25de750382978a00c5e094b8463b5d731f7da1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestException.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestException.h >@@ -50,6 +50,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestException(JSC::Structure*, JSDOMGlobalObject&, Ref<TestException>&&); > >@@ -58,7 +59,7 @@ protected: > > class JSTestExceptionOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp >index f64c585af1933cd3e4dc5b64ecafda007c7cd461..43be1da2c47b90efe427c67bba5b063b396bdf0c 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMWrapperCache.h" > #include "ScriptExecutionContext.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -183,10 +184,19 @@ EncodedJSValue jsTestGenerateIsReachableASecretAttribute(ExecState* state, Encod > return IDLAttribute<JSTestGenerateIsReachable>::get<jsTestGenerateIsReachableASecretAttributeGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "aSecretAttribute"); > } > >-bool JSTestGenerateIsReachableOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestGenerateIsReachable::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestGenerateIsReachable*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestGenerateIsReachableOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > auto* jsTestGenerateIsReachable = jsCast<JSTestGenerateIsReachable*>(handle.slot()->asCell()); > TestGenerateIsReachable* root = &jsTestGenerateIsReachable->wrapped(); >+ if (UNLIKELY(reason)) >+ *reason = "Reachable from TestGenerateIsReachable"; > return visitor.containsOpaqueRoot(root); > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h b/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h >index c788ce1ccb7a63aca8adf4b304a6c4b6dc86a937..0065023501d3e8368482cb8ea6a8b7b2dd882e99 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestGenerateIsReachable.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestGenerateIsReachable(JSC::Structure*, JSDOMGlobalObject&, Ref<TestGenerateIsReachable>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestGenerateIsReachableOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.cpp >index 04ae749b4b358ac1307b4a889958b0437439027b..a40d4b4853cfb9cc045dfc9d9f21be59ba61a81a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.cpp >@@ -36,6 +36,7 @@ > #include "ScriptExecutionContext.h" > #include "WebCoreJSClientData.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -568,10 +569,18 @@ EncodedJSValue JSC_HOST_CALL jsTestGlobalObjectInstanceFunctionTestFeatureGetSec > > #endif > >-bool JSTestGlobalObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestGlobalObject::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestGlobalObject*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestGlobalObjectOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.h b/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.h >index fe261f5ae10a6d05d85835c93603f1d4fde32281..7fd48750c1df4cc275aa56dee7a423906148545d 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestGlobalObject.h >@@ -51,6 +51,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::HasStaticPropertyTable | Base::StructureFlags; > protected: >@@ -61,7 +62,7 @@ protected: > > class JSTestGlobalObjectOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.cpp >index 47f0878ebd9168a5e7d24a0e5e7360fe7ac67b40..4591d94de5d1d413f5d3dfb958c4345a4e7636a6 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -246,10 +247,18 @@ bool setJSTestIndexedSetterNoIdentifierConstructor(ExecState* state, EncodedJSVa > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestIndexedSetterNoIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestIndexedSetterNoIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.h >index 866c415953a0e8a3cde28c9466ecb2bfa0e8bea0..b7aa998c868bb6dda46ae300acfdfa534fb19c4f 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterNoIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestIndexedSetterNoIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.cpp >index 40beeff60cb2dfcd46de93523a32b156cef14b2f..8c606d3ee7e32135b4934cf3e3924f23aaee5b7f 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -246,10 +247,18 @@ bool setJSTestIndexedSetterThrowingExceptionConstructor(ExecState* state, Encode > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestIndexedSetterThrowingException::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestIndexedSetterThrowingException*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.h b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.h >index 088c4bbf03d88f62be60ff5691c2dd49ccee3c3c..29ad2be67c157c9bbc5391054dc5d465588f76e1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterThrowingException.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestIndexedSetterThrowingExceptionOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.cpp >index 755bccc7334b029a69c8d5521ba9260109260675..d2179d09e20b65d1fe9d27a04f3ee0ae31db3564 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.cpp >@@ -30,6 +30,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -278,10 +279,18 @@ EncodedJSValue JSC_HOST_CALL jsTestIndexedSetterWithIdentifierPrototypeFunctionI > return IDLOperation<JSTestIndexedSetterWithIdentifier>::call<jsTestIndexedSetterWithIdentifierPrototypeFunctionIndexedSetterBody>(*state, "indexedSetter"); > } > >-bool JSTestIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestIndexedSetterWithIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestIndexedSetterWithIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.h >index 83ebf5299e98ef94f7f9fd8c4cf7191481cc28d0..040dfaaae0c54555c25a004fe7f91f28b490a124 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIndexedSetterWithIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestIndexedSetterWithIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp >index daf072587c0266f57222f13631c48cc0c79c773f..af727a8283c11342109860c134cb3dfd099d2d1a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.cpp >@@ -34,6 +34,7 @@ > #include "JSDOMWrapperCache.h" > #include "TestSupplemental.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -984,12 +985,23 @@ EncodedJSValue JSC_HOST_CALL jsTestInterfaceConstructorFunctionSupplementalMetho > > #endif > >-bool JSTestInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestInterface::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestInterface*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > auto* jsTestInterface = jsCast<JSTestInterface*>(handle.slot()->asCell()); >- if (jsTestInterface->wrapped().hasPendingActivity()) >+ if (jsTestInterface->wrapped().hasPendingActivity()) { >+ if (UNLIKELY(reason)) >+ *reason = "ActiveDOMObject with pending activity"; > return true; >+ } > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h b/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h >index be94dc5c3b6c1899b854e6797f838e31b221c19a..a55a4e1aea426de16a7b8acb2276169c8d4b5cc0 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestInterface.h >@@ -53,6 +53,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > > // Custom attributes > #if ENABLE(Condition22) || ENABLE(Condition23) >@@ -83,7 +84,7 @@ protected: > > class JSTestInterfaceOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.cpp >index 0463c511c3f06df7cd9590221d8a70d141759ba7..37e0b48016cd29c308937dbaf5d3e79e2d11ae06 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -177,10 +178,18 @@ EncodedJSValue jsTestInterfaceLeadingUnderscoreReadonly(ExecState* state, Encode > return IDLAttribute<JSTestInterfaceLeadingUnderscore>::get<jsTestInterfaceLeadingUnderscoreReadonlyGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "readonly"); > } > >-bool JSTestInterfaceLeadingUnderscoreOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestInterfaceLeadingUnderscore::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestInterfaceLeadingUnderscore*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestInterfaceLeadingUnderscoreOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.h b/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.h >index cd206ca31b003000156aece6d8913958c3325cb3..4cc8d8c728cdd898934c2e0a5ccf8c211ba176f4 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestInterfaceLeadingUnderscore.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestInterfaceLeadingUnderscore(JSC::Structure*, JSDOMGlobalObject&, Ref<TestInterfaceLeadingUnderscore>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestInterfaceLeadingUnderscoreOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.cpp >index 2e979dbd7f13604d8f64a19b6f1d8153e2cebe5d..aef572451e9c1829f0d70d5dfbc719e3add9d24b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/BuiltinNames.h> > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -230,10 +231,18 @@ JSC::EncodedJSValue JSC_HOST_CALL jsTestIterablePrototypeFunctionForEach(JSC::Ex > return IDLOperation<JSTestIterable>::call<jsTestIterablePrototypeFunctionForEachCaller>(*state, "forEach"); > } > >-bool JSTestIterableOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestIterable::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestIterable*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestIterableOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.h b/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.h >index 4630d7e286a0781e56e1216816c7ae011436cec1..6489f26100c7cf67ed58c8a36e29a540de9a006b 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestIterable.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestIterable(JSC::Structure*, JSDOMGlobalObject&, Ref<TestIterable>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestIterableOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp >index 9a80ab041c541fb49835bc7d39ff29215efad686..0f2e879a127582722f34d0d4d2fda8975fb76127 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.cpp >@@ -30,6 +30,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSMediaQueryListListener.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -186,10 +187,18 @@ EncodedJSValue JSC_HOST_CALL jsTestMediaQueryListListenerPrototypeFunctionMethod > return IDLOperation<JSTestMediaQueryListListener>::call<jsTestMediaQueryListListenerPrototypeFunctionMethodBody>(*state, "method"); > } > >-bool JSTestMediaQueryListListenerOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestMediaQueryListListener::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestMediaQueryListListener*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestMediaQueryListListenerOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h b/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h >index d34bbde576732e43f4b6633fc7711b9105adf361..d0375e3af77feb133d74d48e21d84da29f15e9ab 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestMediaQueryListListener.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestMediaQueryListListener(JSC::Structure*, JSDOMGlobalObject&, Ref<TestMediaQueryListListener>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestMediaQueryListListenerOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.cpp >index aada48c04e6ede9a8e47667af3e512f327573c89..fb0e1f1cb3bc34ee8b3ad56aa730b919e81e2611 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -312,10 +313,18 @@ bool setJSTestNamedAndIndexedSetterNoIdentifierConstructor(ExecState* state, Enc > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedAndIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedAndIndexedSetterNoIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedAndIndexedSetterNoIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedAndIndexedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.h >index 2b82b0927eec1194f6115136af0e49af9e7547a8..10390d972626a944b3910070bd4a16bcad213c1e 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterNoIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedAndIndexedSetterNoIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.cpp >index c27fbbad05248f998f236d29d4224092a25e2699..d32c66a11c187ec2e9483e417942b3b2e38914ba 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -312,10 +313,18 @@ bool setJSTestNamedAndIndexedSetterThrowingExceptionConstructor(ExecState* state > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedAndIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedAndIndexedSetterThrowingException::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedAndIndexedSetterThrowingException*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedAndIndexedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.h >index 3cdb6dc7cf0af377deec11f0ddce8e2202d48042..1bfd74c486cfe217490e31f1e736ff4ba12a4437 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterThrowingException.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedAndIndexedSetterThrowingExceptionOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.cpp >index e4bbce80eca6b873741fbdb7b6c07cf0b7933b81..8f3cb46efb8cc22932c97c90d78cd7b83a5eb31e 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.cpp >@@ -31,6 +31,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -366,10 +367,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedAndIndexedSetterWithIdentifierPrototypeF > return IDLOperation<JSTestNamedAndIndexedSetterWithIdentifier>::call<jsTestNamedAndIndexedSetterWithIdentifierPrototypeFunctionIndexedSetterBody>(*state, "indexedSetter"); > } > >-bool JSTestNamedAndIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedAndIndexedSetterWithIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedAndIndexedSetterWithIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedAndIndexedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.h >index ddcb655da9b90b2350156ea0292f0398a9f2293c..7e88cf4d41d725d40b9ff9d1951fef51b1887269 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedAndIndexedSetterWithIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedAndIndexedSetterWithIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp >index 3733a78a3a3c490ea3c2d76e588c4241b753cc60..ace551b2f8d8b975366e9cf5a5db446f6f30cbe4 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMNamedConstructor.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -197,12 +198,23 @@ bool setJSTestNamedConstructorConstructor(ExecState* state, EncodedJSValue thisV > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedConstructorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedConstructor::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedConstructor*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedConstructorOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > auto* jsTestNamedConstructor = jsCast<JSTestNamedConstructor*>(handle.slot()->asCell()); >- if (jsTestNamedConstructor->wrapped().hasPendingActivity()) >+ if (jsTestNamedConstructor->wrapped().hasPendingActivity()) { >+ if (UNLIKELY(reason)) >+ *reason = "ActiveDOMObject with pending activity"; > return true; >+ } > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h >index 5732bc0e447de180bf0800ba2f23329df97e26be..25c51bd7af3fbf8aa6434bed6c533ecdfd30b2ad 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedConstructor.h >@@ -50,6 +50,7 @@ public: > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static JSC::JSValue getNamedConstructor(JSC::VM&, JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestNamedConstructor(JSC::Structure*, JSDOMGlobalObject&, Ref<TestNamedConstructor>&&); > >@@ -58,7 +59,7 @@ protected: > > class JSTestNamedConstructorOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.cpp >index 825676242e533b7a9f137dcf7e70438409a1763b..2b31a45552deb77e9095ac84d586f2ec3b464b56 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -225,10 +226,18 @@ bool setJSTestNamedDeleterNoIdentifierConstructor(ExecState* state, EncodedJSVal > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedDeleterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedDeleterNoIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedDeleterNoIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedDeleterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.h >index fc93e802a011ed0492eefffc23abd1b4f0c34c2d..2479f4f8c8b1dc5479db1093c7297105c5a5b493 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterNoIdentifier.h >@@ -54,6 +54,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -64,7 +65,7 @@ protected: > > class JSTestNamedDeleterNoIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.cpp >index 8f17172af1d949501c906243a1bde0ab9e641bc3..5da9e6e4f5801c06058b69ac85d8b87fc0df5f2c 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -239,10 +240,18 @@ bool setJSTestNamedDeleterThrowingExceptionConstructor(ExecState* state, Encoded > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedDeleterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedDeleterThrowingException::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedDeleterThrowingException*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedDeleterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.h >index cde11c68195087221eee36dd51e6535dad286184..7bde9b18964ac2a72fd0e39819432f7df69a7e23 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterThrowingException.h >@@ -54,6 +54,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -64,7 +65,7 @@ protected: > > class JSTestNamedDeleterThrowingExceptionOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.cpp >index fc5f6f95fdf653cfa61a660326eb001966a6a258..0fb44b4858702f363fe56276680ca409e1845efb 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -256,10 +257,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedDeleterWithIdentifierPrototypeFunctionNa > return IDLOperation<JSTestNamedDeleterWithIdentifier>::call<jsTestNamedDeleterWithIdentifierPrototypeFunctionNamedDeleterBody>(*state, "namedDeleter"); > } > >-bool JSTestNamedDeleterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedDeleterWithIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedDeleterWithIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedDeleterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.h >index 0141708395045b6f6bcd51a331f0915b2f83fd82..4ef3ec18788c40afc7ac26c9497b37d067bab1a3 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIdentifier.h >@@ -54,6 +54,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -64,7 +65,7 @@ protected: > > class JSTestNamedDeleterWithIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.cpp >index e3ffa78338bbecca51e7a1e1f171abc36acbe0bc..b228f01bf3782b8609257119e47de21512bb9da1 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -243,10 +244,18 @@ bool setJSTestNamedDeleterWithIndexedGetterConstructor(ExecState* state, Encoded > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedDeleterWithIndexedGetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedDeleterWithIndexedGetter::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedDeleterWithIndexedGetter*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedDeleterWithIndexedGetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.h >index 153db7eca306c286430c08e6c7434bbee7f10e17..b3d501787346353e479d7f626179b3a1717731e6 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedDeleterWithIndexedGetter.h >@@ -54,6 +54,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -64,7 +65,7 @@ protected: > > class JSTestNamedDeleterWithIndexedGetterOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.cpp >index c11820ef8adcbe7c47497a804553841523b8ce0f..a888ffc295db1fbcd7df9c00bb3f9774bfae895c 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -204,10 +205,18 @@ bool setJSTestNamedGetterCallWithConstructor(ExecState* state, EncodedJSValue th > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedGetterCallWithOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedGetterCallWith::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedGetterCallWith*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedGetterCallWithOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.h >index 6bd2e8df879970b2d5bfd8f686fbecf8469c7ef3..36db01798c601c9cee889842ddbcec8b3393e7fd 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterCallWith.h >@@ -52,6 +52,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -62,7 +63,7 @@ protected: > > class JSTestNamedGetterCallWithOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.cpp >index 63dbc63dbe96df2e0cc0fdbde19257270f5def73..331da7199f23b6d5fab0888baa89925605cbf0d5 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -204,10 +205,18 @@ bool setJSTestNamedGetterNoIdentifierConstructor(ExecState* state, EncodedJSValu > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedGetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedGetterNoIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedGetterNoIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedGetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.h >index 73180d5e2bb04132d08714f254eae69eb7557cae..d37c83f80b7c79ee99eb3226b591d5406ff88ea0 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterNoIdentifier.h >@@ -52,6 +52,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -62,7 +63,7 @@ protected: > > class JSTestNamedGetterNoIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.cpp >index bd96cab29ac60d9ef887392f0c379fdfee601df8..90a95fe6776ad90a927d4f9ef430e3654ae694de 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -232,10 +233,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedGetterWithIdentifierPrototypeFunctionGet > return IDLOperation<JSTestNamedGetterWithIdentifier>::call<jsTestNamedGetterWithIdentifierPrototypeFunctionGetterNameBody>(*state, "getterName"); > } > >-bool JSTestNamedGetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedGetterWithIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedGetterWithIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedGetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.h >index f57b9d5fc6e39754d71058a67a18a3d3049cd371..0d55fef234485013f8d761c3c19b3f270b49edc0 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedGetterWithIdentifier.h >@@ -52,6 +52,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -62,7 +63,7 @@ protected: > > class JSTestNamedGetterWithIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.cpp >index c89b23bfd9abf4f85381e48ac6baf93aa3c7cf65..5409aaeeab22234bf2c9955dfa032b0b9b771e7e 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -266,10 +267,18 @@ bool setJSTestNamedSetterNoIdentifierConstructor(ExecState* state, EncodedJSValu > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterNoIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterNoIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterNoIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.h >index 4544c51559cf7953304c46c6466abc7c393780f0..637570f216ee383255bc89b4e28ee9ff260aed50 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterNoIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterNoIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.cpp >index 3afa11d0ae3e89f3cbf0ee8944f1d6bef114d8e7..97a76b330f55b8d759bee4684541f685950fbad2 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -266,10 +267,18 @@ bool setJSTestNamedSetterThrowingExceptionConstructor(ExecState* state, EncodedJ > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterThrowingException::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterThrowingException*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterThrowingExceptionOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.h >index ef4a26d9001f60daa0592032c61ab6563200a901..5b1713c0cf2bfe1a1214b76fb527168eb3ea3491 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterThrowingException.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterThrowingExceptionOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.cpp >index 92873641ef7f449d18dc56baacbe07f3a88e6d2f..e50727a0cac04754bd9683654676362aec43c457 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -297,10 +298,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedSetterWithIdentifierPrototypeFunctionNam > return IDLOperation<JSTestNamedSetterWithIdentifier>::call<jsTestNamedSetterWithIdentifierPrototypeFunctionNamedSetterBody>(*state, "namedSetter"); > } > >-bool JSTestNamedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithIdentifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithIdentifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithIdentifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.h >index bc885b3ca95728467b1a5b73abe56223a0cc8656..0ec45f40f44e0e272fe2c3673666e37be6e1d96a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIdentifier.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithIdentifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.cpp >index 66d5a8adaba59ee0893526d488d16b9935c39df9..aac1168cc5025fbe0af36aacc6d540537b436a17 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.cpp >@@ -31,6 +31,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -340,10 +341,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedSetterWithIndexedGetterPrototypeFunction > return IDLOperation<JSTestNamedSetterWithIndexedGetter>::call<jsTestNamedSetterWithIndexedGetterPrototypeFunctionIndexedSetterBody>(*state, "indexedSetter"); > } > >-bool JSTestNamedSetterWithIndexedGetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithIndexedGetter::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithIndexedGetter*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithIndexedGetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.h >index 2f24520fbf19fea040e112fe79e03144d23a802a..dbebe4c48628457f194f10c4807a351c1d6a727e 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetter.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithIndexedGetterOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.cpp >index 3c29137d3a6a173653083ce7774c80837fcb012b..e1e39d29f721b6d763513aaf90351a0079497995 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.cpp >@@ -31,6 +31,7 @@ > #include "JSDOMWrapperCache.h" > #include "URL.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/PropertyNameArray.h> > #include <wtf/GetPtr.h> >@@ -390,10 +391,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedSetterWithIndexedGetterAndSetterPrototyp > return IDLOperation<JSTestNamedSetterWithIndexedGetterAndSetter>::call<jsTestNamedSetterWithIndexedGetterAndSetterPrototypeFunctionIndexedSetterOverloadDispatcher>(*state, "indexedSetter"); > } > >-bool JSTestNamedSetterWithIndexedGetterAndSetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithIndexedGetterAndSetter::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithIndexedGetterAndSetter*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithIndexedGetterAndSetterOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.h >index 45060c755f6575208140dc41eafb66874853a105..c160d68f251a8f6d8523ce3464ebc124e24ed7db 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithIndexedGetterAndSetter.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithIndexedGetterAndSetterOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.cpp >index c33fd8ed75102a06deb4618343245c19c14f6036..5a045f32e0f8850ae20b4e0971ef8e5a0e642279 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -253,10 +254,18 @@ bool setJSTestNamedSetterWithOverrideBuiltinsConstructor(ExecState* state, Encod > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestNamedSetterWithOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithOverrideBuiltins::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithOverrideBuiltins*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.h >index d084ca5f42145c05ea18d0ca3c15f2fd21c35f61..fe037c31325ec1f4496fce1fd7e9574af69f8f9d 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithOverrideBuiltins.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpure | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithOverrideBuiltinsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.cpp >index 44057fe87a12c69d90710740e24a0908df94c459..e7a36b05e9dd4f066de1f91a9ed4f5105f52351a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.cpp >@@ -30,6 +30,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -335,10 +336,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedSetterWithUnforgablePropertiesInstanceFu > return IDLOperation<JSTestNamedSetterWithUnforgableProperties>::call<jsTestNamedSetterWithUnforgablePropertiesInstanceFunctionUnforgeableOperationBody>(*state, "unforgeableOperation"); > } > >-bool JSTestNamedSetterWithUnforgablePropertiesOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithUnforgableProperties::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithUnforgableProperties*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithUnforgablePropertiesOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.h >index 964a17df1268d8464aad9b59c16e1364dc8d4ed4..a16868f2f2c31156e386da03211b1e2f97fc5ef3 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgableProperties.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpureForPropertyAbsence | JSC::HasStaticPropertyTable | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithUnforgablePropertiesOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.cpp >index db2d6c590ea48ece128dd82ea484a1812ed20cd3..5a71c2a579e05bff9bb6ffef7a0aa792c2a9f0c3 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.cpp >@@ -30,6 +30,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -322,10 +323,18 @@ EncodedJSValue JSC_HOST_CALL jsTestNamedSetterWithUnforgablePropertiesAndOverrid > return IDLOperation<JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins>::call<jsTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltinsInstanceFunctionUnforgeableOperationBody>(*state, "unforgeableOperation"); > } > >-bool JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.h >index 385b0a5b60229ba23342200a9aa13169fc2e6c45..9e4267cb60760532e08d19a1d1eb5f69643e9647 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltins.h >@@ -55,6 +55,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpure | JSC::HasStaticPropertyTable | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -65,7 +66,7 @@ protected: > > class JSTestNamedSetterWithUnforgablePropertiesAndOverrideBuiltinsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >index b2ba55910839b7e187adfd5acd73f80c27319797..fef04e9f02082f4646c94454e26ed79fe27388c8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp >@@ -35,6 +35,7 @@ > #include "RuntimeEnabledFeatures.h" > #include "ScriptExecutionContext.h" > #include <JavaScriptCore/BuiltinNames.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/ObjectConstructor.h> > #include <wtf/GetPtr.h> >@@ -412,6 +413,13 @@ EncodedJSValue JSC_HOST_CALL jsTestNodePrototypeFunctionToJSON(ExecState* state) > return IDLOperation<JSTestNode>::call<jsTestNodePrototypeFunctionToJSONBody>(*state, "toJSON"); > } > >+void JSTestNode::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestNode*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > #if ENABLE(BINDING_INTEGRITY) > #if PLATFORM(WIN) > #pragma warning(disable: 4483) >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.h b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.h >index 8f8d2c388bf7bb97227a4e96866c92f3d11dfde6..e7c25d554ca284fcc251736aeb4d4736a4a474b5 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestNode.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestNode.h >@@ -49,6 +49,7 @@ public: > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static JSC::JSObject* serialize(JSC::ExecState&, JSTestNode& thisObject, JSDOMGlobalObject&, JSC::ThrowScope&); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestNode& wrapped() const > { > return static_cast<TestNode&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >index c0466c266b737f6c885d2aafd05b5f16f682d501..49bddc9f0b7dcc8207877383c9320bc2a5645d38 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp >@@ -82,6 +82,7 @@ > #include <JavaScriptCore/ArrayPrototype.h> > #include <JavaScriptCore/BuiltinNames.h> > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/IteratorOperations.h> > #include <JavaScriptCore/JSArray.h> > #include <JavaScriptCore/JSCInlines.h> >@@ -8389,10 +8390,18 @@ void JSTestObj::visitChildren(JSCell* cell, SlotVisitor& visitor) > visitor.append(thisObject->m_cachedAttribute2); > } > >-bool JSTestObjOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestObj::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestObj*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestObjOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h >index 85424433f82e4febd75f635507b0e7af9d58f954..1e1b467ffe17da906e8faf1d3942f88e1a15c1c8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestObj.h >@@ -62,6 +62,7 @@ public: > mutable JSC::WriteBarrier<JSC::Unknown> m_cachedAttribute2; > static void visitChildren(JSCell*, JSC::SlotVisitor&); > >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > > // Custom attributes > JSC::JSValue customAttr(JSC::ExecState&) const; >@@ -84,7 +85,7 @@ protected: > > class JSTestObjOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp >index 41811b9f771f72ee6614a3750623429f15a62739..105ce1aae3ec80e9f9c10a878e86db0dbbecf969 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.cpp >@@ -32,6 +32,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -249,10 +250,18 @@ bool setJSTestOverloadedConstructorsConstructor(ExecState* state, EncodedJSValue > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestOverloadedConstructorsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestOverloadedConstructors::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestOverloadedConstructors*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestOverloadedConstructorsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h >index b78d83a78a88a95e0a9faa20c5131e3cc7f55967..289a635abf5196673aa11bd46ab0fadb835ae913 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructors.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestOverloadedConstructors(JSC::Structure*, JSDOMGlobalObject&, Ref<TestOverloadedConstructors>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestOverloadedConstructorsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.cpp >index 90ce90d5020bb188617dc1464a071077a7913e62..5b3b630c41ff328109d05099ca78cf56f25df3fb 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/IteratorOperations.h> > #include <JavaScriptCore/JSArray.h> > #include <JavaScriptCore/JSCInlines.h> >@@ -205,10 +206,18 @@ bool setJSTestOverloadedConstructorsWithSequenceConstructor(ExecState* state, En > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestOverloadedConstructorsWithSequenceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestOverloadedConstructorsWithSequence::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestOverloadedConstructorsWithSequence*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestOverloadedConstructorsWithSequenceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.h b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.h >index e358daa4d24fc3d23e09cde4ea18e907774c471d..e0f54ebedffe2f2dd1b59ebb0a8739b6b6df1682 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverloadedConstructorsWithSequence.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestOverloadedConstructorsWithSequence(JSC::Structure*, JSDOMGlobalObject&, Ref<TestOverloadedConstructorsWithSequence>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestOverloadedConstructorsWithSequenceOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp >index 03928b51d11dd1715914b5ce161ebcb850bc4ca7..ab44888264d8dcbc42d3cd24555f1be3bdabe2f8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.cpp >@@ -32,6 +32,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSNode.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -235,10 +236,18 @@ EncodedJSValue JSC_HOST_CALL jsTestOverrideBuiltinsPrototypeFunctionNamedItem(Ex > return IDLOperation<JSTestOverrideBuiltins>::call<jsTestOverrideBuiltinsPrototypeFunctionNamedItemBody>(*state, "namedItem"); > } > >-bool JSTestOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestOverrideBuiltins::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestOverrideBuiltins*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestOverrideBuiltinsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h b/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h >index f5be072cc8d6e8a1370546955d9817db0f569082..f2a26af39a46c1879f56cb3cd81c67970cf2dbfa 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestOverrideBuiltins.h >@@ -52,6 +52,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::GetOwnPropertySlotIsImpure | JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetOwnPropertySlot | JSC::OverridesGetPropertyNames | Base::StructureFlags; > protected: >@@ -62,7 +63,7 @@ protected: > > class JSTestOverrideBuiltinsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.cpp >index b04c35bd15240a8068861b25ef2c778a8b45c511..2e03cbfc2cb3ef4f88685a1f0826de94d0987cfc 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.cpp >@@ -27,6 +27,7 @@ > #include "JSDOMWrapperCache.h" > #include "JSPluginElementFunctions.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -208,10 +209,18 @@ bool setJSTestPluginInterfaceConstructor(ExecState* state, EncodedJSValue thisVa > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >-bool JSTestPluginInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestPluginInterface::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestPluginInterface*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestPluginInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.h b/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.h >index 37a30ec9bf25254d26d23bcb328b681d24d46f10..6ddb79c5c5cf01ad04febfd7133577c60516f7e8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestPluginInterface.h >@@ -56,6 +56,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::InterceptsGetOwnPropertySlotByIndexEvenWhenLengthIsNotZero | JSC::OverridesGetCallData | JSC::OverridesGetOwnPropertySlot | Base::StructureFlags; > protected: >@@ -66,7 +67,7 @@ protected: > > class JSTestPluginInterfaceOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp >index 149cc9b7c60beb1ab1be271b6b451daf18b6f421..12836614a2de7ba1bb507418b97fa434fe3722ad 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.cpp >@@ -33,6 +33,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMGlobalObject.h" > #include "JSDOMWrapperCache.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -285,6 +286,13 @@ EncodedJSValue jsTestPromiseRejectionEventReason(ExecState* state, EncodedJSValu > return IDLAttribute<JSTestPromiseRejectionEvent>::get<jsTestPromiseRejectionEventReasonGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "reason"); > } > >+void JSTestPromiseRejectionEvent::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestPromiseRejectionEvent*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > #if ENABLE(BINDING_INTEGRITY) > #if PLATFORM(WIN) > #pragma warning(disable: 4483) >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h b/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h >index 442682434b02c1495ed55067fb94f3a23ffb477f..f4695fa4c5ad6665805026918ee9fd6ddc9646e9 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestPromiseRejectionEvent.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestPromiseRejectionEvent& wrapped() const > { > return static_cast<TestPromiseRejectionEvent&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp >index 36d92d00091c863dff361d61685f97daf75108f4..025e18aac5e6a8b28dad27259e072acb5e7c8603 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.cpp >@@ -36,6 +36,7 @@ > #include "JSTestSerializationIndirectInheritance.h" > #include "JSTestSerializationInheritFinal.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/ObjectConstructor.h> > #include <wtf/GetPtr.h> >@@ -542,10 +543,18 @@ EncodedJSValue JSC_HOST_CALL jsTestSerializationPrototypeFunctionToJSON(ExecStat > return IDLOperation<JSTestSerialization>::call<jsTestSerializationPrototypeFunctionToJSONBody>(*state, "toJSON"); > } > >-bool JSTestSerializationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestSerialization::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestSerialization*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestSerializationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.h >index 009d66f4bcdd4e147bceb9805976b8780a00681e..d272847f7b43d9ed5381367b3541bbbf31347ef8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerialization.h >@@ -50,6 +50,7 @@ public: > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static JSC::JSObject* serialize(JSC::ExecState&, JSTestSerialization& thisObject, JSDOMGlobalObject&, JSC::ThrowScope&); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestSerialization(JSC::Structure*, JSDOMGlobalObject&, Ref<TestSerialization>&&); > >@@ -58,7 +59,7 @@ protected: > > class JSTestSerializationOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp >index df64eadc4736ac2833bc58af47159546404e0f20..c29692d643d1dbbbf0d4998f007922271fef7c38 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.cpp >@@ -25,6 +25,7 @@ > #include "JSDOMConstructorNotConstructable.h" > #include "JSDOMExceptionHandling.h" > #include "JSDOMWrapperCache.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -146,5 +147,12 @@ bool setJSTestSerializationIndirectInheritanceConstructor(ExecState* state, Enco > return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue)); > } > >+void JSTestSerializationIndirectInheritance::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestSerializationIndirectInheritance*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > > } >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h >index a1335fadc915d454cc5a4b88775ed48da5323b80..0dd045ae685eddacf95ecdbab3eddae15c8a5bee 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationIndirectInheritance.h >@@ -48,6 +48,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestSerializationIndirectInheritance& wrapped() const > { > return static_cast<TestSerializationIndirectInheritance&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.cpp >index 16ad10ebb20a93ce1800e80e83888661b20b6517..28f1d3babf4443ee11e8389def29b6f5ef5308ac 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/ObjectConstructor.h> > #include <wtf/GetPtr.h> >@@ -221,5 +222,12 @@ EncodedJSValue JSC_HOST_CALL jsTestSerializationInheritPrototypeFunctionToJSON(E > return IDLOperation<JSTestSerializationInherit>::call<jsTestSerializationInheritPrototypeFunctionToJSONBody>(*state, "toJSON"); > } > >+void JSTestSerializationInherit::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestSerializationInherit*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > > } >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.h >index 0673854c2f01cce43c8ef8ad1fea4164bb81edd1..02873a26fcc041bc98a64a557b3ec978e3ebca50 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInherit.h >@@ -49,6 +49,7 @@ public: > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static JSC::JSObject* serialize(JSC::ExecState&, JSTestSerializationInherit& thisObject, JSDOMGlobalObject&, JSC::ThrowScope&); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestSerializationInherit& wrapped() const > { > return static_cast<TestSerializationInherit&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.cpp >index f0c4085a3632331ab771f61aa5a2c11711581901..4743ccd4ff1213a05158ec5c2c9530265db2d2a9 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMExceptionHandling.h" > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <JavaScriptCore/ObjectConstructor.h> > #include <wtf/GetPtr.h> >@@ -255,5 +256,12 @@ EncodedJSValue JSC_HOST_CALL jsTestSerializationInheritFinalPrototypeFunctionToJ > return IDLOperation<JSTestSerializationInheritFinal>::call<jsTestSerializationInheritFinalPrototypeFunctionToJSONBody>(*state, "toJSON"); > } > >+void JSTestSerializationInheritFinal::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestSerializationInheritFinal*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ > > } >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.h >index d16f85fc53fb0de09f91bd69df5e681c9163cd48..7c475752d40c301b244933ce0103968943101682 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializationInheritFinal.h >@@ -49,6 +49,7 @@ public: > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); > static JSC::JSObject* serialize(JSC::ExecState&, JSTestSerializationInheritFinal& thisObject, JSDOMGlobalObject&, JSC::ThrowScope&); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > TestSerializationInheritFinal& wrapped() const > { > return static_cast<TestSerializationInheritFinal&>(Base::wrapped()); >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >index d3fedaab9657db54d3cbb579b0bc8d4500e7deb6..19bf98325ca2a17d95ab8b19f16b12b3abc6957a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.cpp >@@ -37,6 +37,7 @@ > #include "JSMessagePort.h" > #include "SerializedScriptValue.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSArray.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> >@@ -345,10 +346,18 @@ void JSTestSerializedScriptValueInterface::visitChildren(JSCell* cell, SlotVisit > visitor.append(thisObject->m_cachedReadonlyValue); > } > >-bool JSTestSerializedScriptValueInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestSerializedScriptValueInterface::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestSerializedScriptValueInterface*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestSerializedScriptValueInterfaceOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >index 069a1d5de134cf050ffb9a1a87da4f4f14aa1bf8..feaec894c070202752c76f5da4b3eea80fc59a00 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestSerializedScriptValueInterface.h >@@ -55,6 +55,7 @@ public: > mutable JSC::WriteBarrier<JSC::Unknown> m_cachedReadonlyValue; > static void visitChildren(JSCell*, JSC::SlotVisitor&); > >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestSerializedScriptValueInterface(JSC::Structure*, JSDOMGlobalObject&, Ref<TestSerializedScriptValueInterface>&&); > >@@ -63,7 +64,7 @@ protected: > > class JSTestSerializedScriptValueInterfaceOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.cpp >index d2275eda22f66ddcd9c954abb3ae1e82e811ffbc..5ee1a21a557d1063a3440c42bc15a68af3203e5d 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -179,10 +180,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierPrototypeFunctionToString(ExecStat > return IDLOperation<JSTestStringifier>::call<jsTestStringifierPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifier::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifier*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.h >index f432bee618a68fbfb024efbf87c76dda6d1a62b7..55381f70a52d8d53b33bfe059c78ad5031815284 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifier.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifier(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifier>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.cpp >index 0459c1ae98d3839db757ecc7860abc39a5529e72..a43da53d9bf8e4d4c4bac2d26e8d7251c6770200 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -179,10 +180,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierAnonymousOperationPrototypeFunctio > return IDLOperation<JSTestStringifierAnonymousOperation>::call<jsTestStringifierAnonymousOperationPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierAnonymousOperationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierAnonymousOperation::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierAnonymousOperation*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierAnonymousOperationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.h >index f29d3e0fde5aae9e97d3d46936e743f96f573ecf..14aa0ed3ee9aced16a57bcb45932282d0d49aa82 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierAnonymousOperation.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierAnonymousOperation(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierAnonymousOperation>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierAnonymousOperationOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.cpp >index 0f0a914c379501845ddeb2ffe04612142aa8b0b9..64e17d21634b826cf715920b57e20fc9590b751a 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -194,10 +195,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierNamedOperationPrototypeFunctionToS > return IDLOperation<JSTestStringifierNamedOperation>::call<jsTestStringifierNamedOperationPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierNamedOperationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierNamedOperation::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierNamedOperation*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierNamedOperationOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.h >index 860de6cbb5aa6358347bc93e0853c3cd452793f9..5bc10ef65d2194401a53e3e5cc2318fd45fbbe54 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierNamedOperation.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierNamedOperation(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierNamedOperation>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierNamedOperationOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.cpp >index d699c81711100dc0b641092395cbe003f64618c9..3e17fd7e64e68e73d8b9c8f218d283855c78c9cb 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -194,10 +195,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierOperationImplementedAsPrototypeFun > return IDLOperation<JSTestStringifierOperationImplementedAs>::call<jsTestStringifierOperationImplementedAsPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierOperationImplementedAsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierOperationImplementedAs::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierOperationImplementedAs*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierOperationImplementedAsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.h >index 9d407009141bdacb6decc6e3cb3831de80d2c63a..f93ff116869596bf7efc28c9ee6275adffb586ec 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationImplementedAs.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierOperationImplementedAs(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierOperationImplementedAs>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierOperationImplementedAsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.cpp >index 3d190341c5730507b1b371535212faab52e67788..e863e8ebc35293cbde3eee694c3530618613a8a4 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.cpp >@@ -28,6 +28,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -179,10 +180,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierOperationNamedToStringPrototypeFun > return IDLOperation<JSTestStringifierOperationNamedToString>::call<jsTestStringifierOperationNamedToStringPrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierOperationNamedToStringOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierOperationNamedToString::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierOperationNamedToString*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierOperationNamedToStringOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.h >index ff84566bc8f27480a9706c081fbcb15a8fa2d2ab..12de238e0f628d609fb18c9c05c5f800c6b24ac8 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierOperationNamedToString.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierOperationNamedToString(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierOperationNamedToString>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierOperationNamedToStringOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.cpp >index 83d787464a23052e844053fb1f3ff6af26b3e047..e313f2157b347f726fa0e79a3201a70c11347907 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -201,10 +202,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierReadOnlyAttributePrototypeFunction > return IDLOperation<JSTestStringifierReadOnlyAttribute>::call<jsTestStringifierReadOnlyAttributePrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierReadOnlyAttributeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierReadOnlyAttribute::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierReadOnlyAttribute*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierReadOnlyAttributeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.h >index 342ca59fa1dd818984f8340c9fd1ec44badf0cb5..6dcbdc8d955e5b2deb5eb0125053c22528b5d491 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadOnlyAttribute.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierReadOnlyAttribute(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierReadOnlyAttribute>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierReadOnlyAttributeOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.cpp >index 41dadeef05fcf983dfb640f910caa68352f69f96..c552451255f9b3ba6ce99ee2f88a0e7f4696d1d5 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.cpp >@@ -29,6 +29,7 @@ > #include "JSDOMOperation.h" > #include "JSDOMWrapperCache.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> > #include <wtf/PointerPreparations.h> >@@ -219,10 +220,18 @@ EncodedJSValue JSC_HOST_CALL jsTestStringifierReadWriteAttributePrototypeFunctio > return IDLOperation<JSTestStringifierReadWriteAttribute>::call<jsTestStringifierReadWriteAttributePrototypeFunctionToStringBody>(*state, "toString"); > } > >-bool JSTestStringifierReadWriteAttributeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestStringifierReadWriteAttribute::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestStringifierReadWriteAttribute*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestStringifierReadWriteAttributeOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.h b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.h >index dda4d9d1041ee057077a6263d407623f99d189a7..cb21c3ed45501284a35d2f645cfa9b1035bf9398 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestStringifierReadWriteAttribute.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > protected: > JSTestStringifierReadWriteAttribute(JSC::Structure*, JSDOMGlobalObject&, Ref<TestStringifierReadWriteAttribute>&&); > >@@ -57,7 +58,7 @@ protected: > > class JSTestStringifierReadWriteAttributeOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp b/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp >index 33671dcaa99e913baa137840bec90c16b5a424f6..8cb261620b271d37d9d8298fdeb809b0d18260c9 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp >@@ -45,6 +45,7 @@ > #include "JSTestSubObj.h" > #include "SerializedScriptValue.h" > #include <JavaScriptCore/FunctionPrototype.h> >+#include <JavaScriptCore/HeapSnapshotBuilder.h> > #include <JavaScriptCore/JSArray.h> > #include <JavaScriptCore/JSCInlines.h> > #include <wtf/GetPtr.h> >@@ -741,10 +742,18 @@ EncodedJSValue JSC_HOST_CALL jsTestTypedefsPrototypeFunctionMethodWithException( > return IDLOperation<JSTestTypedefs>::call<jsTestTypedefsPrototypeFunctionMethodWithExceptionBody>(*state, "methodWithException"); > } > >-bool JSTestTypedefsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor) >+void JSTestTypedefs::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder) >+{ >+ auto* thisObject = jsCast<JSTestTypedefs*>(cell); >+ builder.setWrappedObjectForCell(cell, &thisObject->wrapped()); >+ Base::heapSnapshot(cell, builder); >+} >+ >+bool JSTestTypedefsOwner::isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown> handle, void*, SlotVisitor& visitor, const char** reason) > { > UNUSED_PARAM(handle); > UNUSED_PARAM(visitor); >+ UNUSED_PARAM(reason); > return false; > } > >diff --git a/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h b/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h >index d8fb0f5c5566717dc7b19c949b9fddeb7eca1e5e..36f2aed83a4a1a617ccfd38285745b0eb895f6ee 100644 >--- a/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h >+++ b/Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h >@@ -49,6 +49,7 @@ public: > } > > static JSC::JSValue getConstructor(JSC::VM&, const JSC::JSGlobalObject*); >+ static void heapSnapshot(JSCell*, JSC::HeapSnapshotBuilder&); > public: > static const unsigned StructureFlags = JSC::HasStaticPropertyTable | Base::StructureFlags; > protected: >@@ -59,7 +60,7 @@ protected: > > class JSTestTypedefsOwner : public JSC::WeakHandleOwner { > public: >- virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&); >+ virtual bool isReachableFromOpaqueRoots(JSC::Handle<JSC::Unknown>, void* context, JSC::SlotVisitor&, const char**); > virtual void finalize(JSC::Handle<JSC::Unknown>, void* context); > }; > >diff --git a/Source/WebCore/dom/Document.idl b/Source/WebCore/dom/Document.idl >index edf34a9e0a71b2bb7b04317e47f047ad93942897..35ff9c057c3e473ff0fe97485ec0dc48cc848b28 100644 >--- a/Source/WebCore/dom/Document.idl >+++ b/Source/WebCore/dom/Document.idl >@@ -35,6 +35,7 @@ typedef ( > Constructor, > ConstructorCallWith=Document, > CustomToJSObject, >+ CustomHeapSnapshot, > DOMJIT, > ExportMacro=WEBCORE_EXPORT, > JSCustomHeader, >diff --git a/Source/WebCore/html/DOMTokenList.idl b/Source/WebCore/html/DOMTokenList.idl >index 8910f8143bc3c25852bb059e56590ac5a5abc2f4..a8a4daef52de5c6e70488b1f7f865a5a43a27c7a 100644 >--- a/Source/WebCore/html/DOMTokenList.idl >+++ b/Source/WebCore/html/DOMTokenList.idl >@@ -26,6 +26,7 @@ > [ > GenerateIsReachable=ImplElementRoot, > SkipVTableValidation, >+ CustomHeapSnapshot > ] interface DOMTokenList { > readonly attribute unsigned long length; > getter DOMString? item(unsigned long index); >diff --git a/Source/WebCore/html/HTMLCollection.idl b/Source/WebCore/html/HTMLCollection.idl >index 6dfae8bd894acdc2d260556626b4c73bdb1c9a5b..921889c131f6a2eef0d9cef87981c2a1952eb259 100644 >--- a/Source/WebCore/html/HTMLCollection.idl >+++ b/Source/WebCore/html/HTMLCollection.idl >@@ -24,6 +24,7 @@ > GenerateIsReachable=ImplOwnerNodeRoot, > LegacyUnenumerableNamedProperties, > ReportExtraMemoryCost, >+ CustomHeapSnapshot, > ] interface HTMLCollection { > readonly attribute unsigned long length; > getter Element? item(unsigned long index); >diff --git a/Source/WebCore/page/DOMWindow.idl b/Source/WebCore/page/DOMWindow.idl >index cd412e998c353967994966292a6e8f30abeba5ab..e5d4b22383e29c3b40cd156c8be5e4d66d55f1c4 100644 >--- a/Source/WebCore/page/DOMWindow.idl >+++ b/Source/WebCore/page/DOMWindow.idl >@@ -33,6 +33,7 @@ typedef USVString CSSOMString; > CustomGetOwnPropertyNames, > CustomGetOwnPropertySlot, > CustomGetPrototype, >+ CustomHeapSnapshot, > CustomPreventExtensions, > CustomProxyToJSObject, > CustomPut, >diff --git a/Source/WebCore/page/mac/PageMac.mm b/Source/WebCore/page/mac/PageMac.mm >index e743d6ea87c05b00770639524658384c9050d34a..88b103fe443b5868b774507819e1e60c6427955e 100644 >--- a/Source/WebCore/page/mac/PageMac.mm >+++ b/Source/WebCore/page/mac/PageMac.mm >@@ -77,7 +77,7 @@ void Page::platformInitialize() > > WTFLogAlways("%u live documents:", Document::allDocuments().size()); > for (const auto* document : Document::allDocuments()) { >- WTFLogAlways("Document %p %s", document, document->url().string().utf8().data()); >+ WTFLogAlways("Document %p (refCount %d) %s", document, document->refCount(), document->url().string().utf8().data()); > } > }); > }); >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 2fc4f37a91338e4b7c17e0efe577f8c68e37a94b..c796ebb106bc020d686e102952f10753ac12e720 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,21 @@ >+2018-06-07 Simon Fraser <simon.fraser@apple.com> >+ >+ Add support for dumping GC heap snapshots, and a viewer >+ https://bugs.webkit.org/show_bug.cgi?id=186416 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a viewer for GC heap snapshots. A snapshot JSON file can be dragged into this >+ page for inspection (or set via the 'filename' URL parameter). >+ >+ For now, this page shows all objects, all roots, and the shortest path from a root >+ to all HTMLDocuments and Windows. >+ >+ * GCHeapInspector/gc-heap-inspector.html: Added. >+ * GCHeapInspector/heap-analysis/HeapSnapshot.js: Added. >+ * GCHeapInspector/script/interface.js: Added. >+ * GCHeapInspector/test-heap.json: Added. >+ > 2018-06-04 Alexey Proskuryakov <ap@apple.com> > > Add Mojave support to WebKit tools >diff --git a/Tools/GCHeapInspector/gc-heap-inspector.html b/Tools/GCHeapInspector/gc-heap-inspector.html >new file mode 100644 >index 0000000000000000000000000000000000000000..4a5fc038d853255d98f5d8333a7a51904b070696 >--- /dev/null >+++ b/Tools/GCHeapInspector/gc-heap-inspector.html >@@ -0,0 +1,204 @@ >+<!DOCTYPE html> >+<head> >+ <title>GC Heap Inspector</title> >+ <meta charset="utf8"> >+ <style type="text/css" media="screen"> >+ >+ body { >+ font-family: "Helvetica Neue"; >+ line-height: 1.3; >+ } >+ >+ h1 { >+ margin-bottom: 0.2em; >+ font-size: 32px; >+ } >+ >+ label { >+ font-size: 13px; >+ } >+ >+ #dropTarget { >+ font-size: 12pt; >+ font-weight: bold; >+ color: #888; >+ position: absolute; >+ top: 20px; right: 20px; >+ border: 2px solid rgba(0, 0, 0, 0.3); >+ background-color: rgba(0, 0, 0, 0.1); >+ padding: 10px; >+ border-radius: 10px; >+ } >+ >+ #dropTarget.dragOver { >+ border: 2px solid rgba(0, 0, 0, 0.1); >+ background-color: rgba(0, 0, 0, 0.5); >+ color: #ddd; >+ } >+ >+ details { >+ margin-left: 20px; >+ } >+ >+ ul.path { >+ margin-top: 5px; >+ } >+ >+ ul.instance-list { >+ margin-top: 0.3em; >+ padding-left: 1.2em; >+ list-style-type: none; >+ } >+ >+ .node-id::before { >+ content: '@'; >+ } >+ >+ .node-id { >+ font-size: smaller; >+ color: silver; >+ display: none; /* Remove if you want to see cell identifiers. */ >+ } >+ >+ .node-address, .node-size, .node-label { >+ font-family: monospace; >+ color: gray; >+ } >+ >+ .node-size { >+ display: none; >+ } >+ >+ .node-gc-root { >+ font-size: smaller; >+ color: maroon; >+ } >+ >+ .node-gc-root img { >+ margin: 0 3px; >+ height: 1.4em; >+ width: 1.4em; >+ vertical-align: middle; >+ cursor: pointer; >+ display: none; >+ } >+ >+ .edge::before { >+ content: ' â¹ '; >+ color: gray; >+ } >+ >+ .edge::after { >+ content: ' â¹'; >+ color: gray; >+ } >+ >+ .edge-data { >+ font-family: monospace; >+ color: gray; >+ } >+ >+ ul.path { >+ list-style-type: none; >+ } >+ >+ #description { >+ position: fixed; >+ margin: 300px calc((100vw - 500px) / 2); >+ border: 2px solid rgba(0, 0, 0, 0.3); >+ background-color: rgba(0, 0, 0, 0.1); >+ padding: 20px 50px; >+ border-radius: 10px; >+ width: 500px; >+ } >+ >+ #description > h1 { >+ margin-top: 10px; >+ margin-bottom: 15px; >+ } >+ >+ #description code { >+ display: block; >+ margin: 15px 0; >+ } >+ >+ #description.hidden { >+ display: none; >+ } >+ >+ #graph-overlay { >+ position: fixed; >+ top: 0; >+ margin: 200px 10vw; >+ background-color: rgba(255, 255, 255, 0.8); >+ border: 2px solid rgba(90, 90, 90, 0.8); >+ padding: 20px 50px; >+ border-radius: 10px; >+ width: 80vw; >+ min-height: 200px; >+ } >+ >+ #graph-overlay.hidden { >+ display: none; >+ } >+ >+ #uiContainer { >+ display: none; >+ } >+ >+ </style> >+ >+ <script src="script/interface.js"></script> >+ <script src="heap-analysis/HeapSnapshot.js"></script> >+ >+ <script> >+ >+ </script> >+</head> >+<body> >+ >+ <header> >+ <div id="dropTarget">Drop GC heap JSON file here to load.</div> >+ </header> >+ >+ <section id="description"> >+ <h1>GC heap debugger</h2> >+ <p>This page is for analyzing JSON dumps of the GC heap. To debug an issue that you think might be a leaked or abandoned object (often a Document or JSGlobalObject), load the test page, then navigate to about:blank or other simple page. Now simulate a memory warning (to clear the page cache) by issuing the following command in a Terminal window: >+ <code>notifyutil -p org.WebKit.lowMemory</code> >+ >+ You can now inspect the list of live documents via: >+ <code>notifyutil -p com.apple.WebKit.showAllDocuments</code> >+ >+ which prints its output to the system log. If this lists documents other than the current page, you may have a leaked or abandoned Document. To see if the GC heap is referencing that Document, obtain a GC heap dump: >+ <code>notifyutil -p com.apple.WebKit.dumpGCHeap</code> >+ >+ That command will generate a JSON file in /tmp (or equivalent); the file path is dumped to the system log. Drag that file onto the drop target in the top right (or use the ?filename= URL parameter). >+ </p> >+ </section> >+ >+ <section id="uiContainer"> >+ >+ <div id="rooted"> >+ </div> >+ >+ <h1>All paths toâ¦</h1> >+ <div id="all-paths"> >+ </div> >+ >+ <h1>Objects</h1> >+ <section id="categories"> >+ </section> >+ >+ <h1>Roots</h1> >+ <section id="roots"> >+ </section> >+ >+ <section id="graph-overlay" class="hidden"> >+ <button onclick="closeGraph()">Close</button> >+ <div id="graph-container"> >+ </div> >+ </section> >+ </section> >+ >+</body> >+</html> >diff --git a/Tools/GCHeapInspector/heap-analysis/HeapSnapshot.js b/Tools/GCHeapInspector/heap-analysis/HeapSnapshot.js >new file mode 100644 >index 0000000000000000000000000000000000000000..2f636f72162d828ae87a21b8a62fc6309d19e50c >--- /dev/null >+++ b/Tools/GCHeapInspector/heap-analysis/HeapSnapshot.js >@@ -0,0 +1,917 @@ >+/* >+ * Copyright (C) 2011 Google Inc. All rights reserved. >+ * Copyright (C) 2016 Apple Inc. All rights reserved. >+ * >+ * Redistribution and use in source and binary forms, with or without >+ * modification, are permitted provided that the following conditions are >+ * met: >+ * >+ * * Redistributions of source code must retain the above copyright >+ * notice, this list of conditions and the following disclaimer. >+ * * Redistributions in binary form must reproduce the above >+ * copyright notice, this list of conditions and the following disclaimer >+ * in the documentation and/or other materials provided with the >+ * distribution. >+ * * Neither the name of Google Inc. nor the names of its >+ * contributors may be used to endorse or promote products derived from >+ * this software without specific prior written permission. >+ * >+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS >+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT >+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR >+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT >+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, >+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT >+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, >+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY >+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT >+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE >+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. >+ */ >+ >+// nodes >+// [<0:id>, <1:size>, <2:classNameTableIndex>, <3:internal>, <4:labelIndex>, <5:address>, <6:wrapped address>] >+let nodeFieldCount = 7; >+const nodeIdOffset = 0; >+const nodeSizeOffset = 1; >+const nodeClassNameOffset = 2; >+const nodeInternalOffset = 3; >+const nodeLabelOffset = 4; >+const nodeAddressOffset = 5; >+const nodeWrappedAddressOffset = 6; >+ >+// edges >+// [<0:fromId>, <1:toId>, <2:typeTableIndex>, <3:edgeDataIndexOrEdgeNameIndex>] >+const edgeFieldCount = 4; >+const edgeFromIdOffset = 0; >+const edgeToIdOffset = 1; >+const edgeTypeOffset = 2; >+const edgeDataOffset = 3; >+ >+// roots >+// [<0:id>, <1:labelIndex>] >+let rootFieldCount = 3; >+const rootIdOffset = 0; >+const rootLabelOffset = 1; >+const reachabilityReasonOffset = 2; >+ >+// Other constants. >+const rootNodeIndex = 0; >+const rootNodeOrdinal = 0; >+const rootNodeIdentifier = 0; >+ >+// Terminology: >+// - `nodeIndex` is an index into the `nodes` list. >+// - `nodeOrdinal` is the order of the node in the `nodes` list. (nodeIndex / nodeFieldCount). >+// - `nodeIdentifier` is the node's id value. (nodes[nodeIndex + nodeIdOffset]). >+// - `edgeIndex` is an index into the `edges` list. >+// >+// Lists: >+// - _nodeOrdinalToFirstOutgoingEdge - `nodeOrdinal` to `edgeIndex` in `edges`. >+// Iterate edges by walking `edges` (edgeFieldCount) and checking if fromIdentifier is current. >+// - _nodeOrdinalToFirstIncomingEdge - `nodeOrdinal` to `incomingEdgeIndex` in `incomingEdges`. >+// Iterate edges by walking `incomingEdges` until `nodeOrdinal+1`'s first incoming edge index. >+// - _nodeOrdinalToDominatorNodeOrdinal - `nodeOrdinal` to `nodeOrdinal` of dominator. >+// - _nodeOrdinalToRetainedSizes - `nodeOrdinal` to retain size value. >+// - _nodeOrdinalIsDead - `nodeOrdinal` is dead or alive. >+// >+// Temporary Lists: >+// - nodeOrdinalToPostOrderIndex - `nodeOrdinal` to a `postOrderIndex`. >+// - postOrderIndexToNodeOrdinal - `postOrderIndex` to a `nodeOrdinal`. >+ >+let nextSnapshotIdentifier = 1; >+ >+HeapSnapshot = class HeapSnapshot >+{ >+ constructor(objectId, snapshotDataString, title = null) >+ { >+ this._identifier = nextSnapshotIdentifier++; >+ this._objectId = objectId; >+ this._title = title; >+ >+ let json = JSON.parse(snapshotDataString); >+ snapshotDataString = null; >+ >+ let {version, type, nodes, nodeClassNames, edges, edgeTypes, edgeNames, roots, labels} = json; >+ console.assert(version === 1, "Expect JavaScriptCore Heap Snapshot version 1"); >+ console.assert(type === "GCDebugging", "Expect a GCDebugging-type snapshot"); >+ >+ this._nodes = nodes; >+ this._nodeCount = nodes.length / nodeFieldCount; >+ >+ this._roots = roots; >+ this._rootCount = roots.length / rootFieldCount; >+ >+ this._edges = edges; >+ this._edgeCount = edges.length / edgeFieldCount; >+ >+ this._edgeTypesTable = edgeTypes; >+ this._edgeNamesTable = edgeNames; >+ this._nodeClassNamesTable = nodeClassNames; >+ this._labelsTable = labels; >+ >+ this._totalSize = 0; >+ this._nodeIdentifierToOrdinal = new Map; // <node identifier> => nodeOrdinal >+ this._lastNodeIdentifier = 0; >+ for (let nodeIndex = 0; nodeIndex < nodes.length; nodeIndex += nodeFieldCount) { >+ let nodeOrdinal = nodeIndex / nodeFieldCount; >+ let nodeIdentifier = nodes[nodeIndex + nodeIdOffset]; >+ this._nodeIdentifierToOrdinal.set(nodeIdentifier, nodeOrdinal); >+ this._totalSize += nodes[nodeIndex + nodeSizeOffset]; >+ if (nodeIdentifier > this._lastNodeIdentifier) >+ this._lastNodeIdentifier = nodeIdentifier; >+ } >+ >+ this._rootIdentifierToReasons = new Map; // <node identifier> => Set of root reasons >+ for (let rootIndex = 0; rootIndex < roots.length; rootIndex += rootFieldCount) { >+ let rootOrdinal = rootIndex / rootFieldCount; >+ let rootIdentifier = roots[rootIndex + rootIdOffset]; >+ let rootReasonIndex = roots[rootIndex + rootLabelOffset]; >+ let rootReachabilityIndex = roots[rootIndex + reachabilityReasonOffset]; >+ >+ let existingReasons = this._rootIdentifierToReasons.get(rootIdentifier); >+ if (existingReasons) { >+ existingReasons.add(rootReasonIndex); >+ existingReasons.add(rootReachabilityIndex); >+ } else >+ this._rootIdentifierToReasons.set(rootIdentifier, new Set([rootReasonIndex, rootReachabilityIndex])); >+ } >+ >+ // FIXME: Replace toIdentifier and fromIdentifier in edges with nodeIndex to reduce hash lookups? >+ >+ this._nodeOrdinalToFirstOutgoingEdge = new Uint32Array(this._nodeCount); // nodeOrdinal => edgeIndex >+ this._buildOutgoingEdges(); >+ >+ this._nodeOrdinalToFirstIncomingEdge = new Uint32Array(this._nodeCount + 1); // nodeOrdinal => incomingNodes/incomingEdges index >+ this._incomingNodes = new Uint32Array(this._edgeCount); // from nodeOrdinals. >+ this._incomingEdges = new Uint32Array(this._edgeCount); // edgeIndex. >+ this._buildIncomingEdges(); >+ >+ let {nodeOrdinalToPostOrderIndex, postOrderIndexToNodeOrdinal} = this._buildPostOrderIndexes(); >+ >+ this._nodeOrdinalToDominatorNodeOrdinal = new Uint32Array(this._nodeCount); >+ this._nodeOrdinalIsGCRoot = new Uint8Array(this._nodeCount); >+ this._buildDominatorIndexes(nodeOrdinalToPostOrderIndex, postOrderIndexToNodeOrdinal); >+ >+ nodeOrdinalToPostOrderIndex = null; >+ >+ this._nodeOrdinalToRetainedSizes = new Uint32Array(this._nodeCount); >+ this._buildRetainedSizes(postOrderIndexToNodeOrdinal); >+ >+ postOrderIndexToNodeOrdinal = null; >+ >+ this._nodeOrdinalIsDead = new Uint8Array(this._nodeCount); >+ >+ let {liveSize, categories} = HeapSnapshot.updateCategoriesAndMetadata(this); >+ this._liveSize = liveSize; >+ this._categories = categories; >+ } >+ >+ get proxyObjectId() { return this._proxyObjectId; } >+ get identifier() { return this._identifier; } >+ get title() { return this._title; } >+ get totalSize() { return this._totalSize; } >+ get totalObjectCount() { return this._totalObjectCount; } >+ get liveSize() { return this._liveSize; } >+ get categories() { return this._categories; } >+ get invalid() { return this._proxyObjectId === 0; } >+ >+ // Static >+ >+ static updateCategoriesAndMetadata(snapshot, allowNodeIdentifierCallback) >+ { >+ let liveSize = 0; >+ let categories = {}; >+ >+ let nodes = snapshot._nodes; >+ let nodeClassNamesTable = snapshot._nodeClassNamesTable; >+ let nodeOrdinalToRetainedSizes = snapshot._nodeOrdinalToRetainedSizes; >+ let nodeOrdinalIsDead = snapshot._nodeOrdinalIsDead; >+ >+ // Skip the <root> node. >+ let firstNodeIndex = nodeFieldCount; >+ let firstNodeOrdinal = 1; >+ for (let nodeIndex = firstNodeIndex, nodeOrdinal = firstNodeOrdinal; nodeIndex < nodes.length; nodeIndex += nodeFieldCount, nodeOrdinal++) { >+ if (allowNodeIdentifierCallback && !allowNodeIdentifierCallback(nodes[nodeIndex + nodeIdOffset])) >+ continue; >+ >+ let classNameTableIndex = nodes[nodeIndex + nodeClassNameOffset]; >+ let className = nodeClassNamesTable[classNameTableIndex]; >+ let size = nodes[nodeIndex + nodeSizeOffset]; >+ let retainedSize = nodeOrdinalToRetainedSizes[nodeOrdinal]; >+ let internal = nodes[nodeIndex + nodeInternalOffset] ? true : false; >+ let dead = nodeOrdinalIsDead[nodeOrdinal] ? true : false; >+ >+ let category = categories[className]; >+ if (!category) >+ category = categories[className] = {className, size: 0, retainedSize: 0, count: 0, internalCount: 0, deadCount: 0}; >+ >+ category.size += size; >+ category.retainedSize += retainedSize; >+ category.count += 1; >+ if (internal) >+ category.internalCount += 1; >+ if (dead) >+ category.deadCount += 1; >+ else >+ liveSize += size; >+ } >+ >+ return {liveSize, categories}; >+ } >+ >+ static allocationBucketCounts(snapshot, bucketSizes, allowNodeIdentifierCallback) >+ { >+ let counts = new Array(bucketSizes.length + 1); >+ let remainderBucket = counts.length - 1; >+ counts.fill(0); >+ >+ let nodes = snapshot._nodes; >+ >+ // Skip the <root> node. >+ let firstNodeIndex = nodeFieldCount; >+ >+ outer: >+ for (let nodeIndex = firstNodeIndex; nodeIndex < nodes.length; nodeIndex += nodeFieldCount) { >+ if (allowNodeIdentifierCallback && !allowNodeIdentifierCallback(nodes[nodeIndex + nodeIdOffset])) >+ continue; >+ >+ let size = nodes[nodeIndex + nodeSizeOffset]; >+ for (let i = 0; i < bucketSizes.length; ++i) { >+ if (size < bucketSizes[i]) { >+ counts[i]++; >+ continue outer; >+ } >+ } >+ counts[remainderBucket]++; >+ } >+ >+ return counts; >+ } >+ >+ static instancesWithClassName(snapshot, className, allowNodeIdentifierCallback) >+ { >+ let instances = []; >+ >+ let nodes = snapshot._nodes; >+ let nodeClassNamesTable = snapshot._nodeClassNamesTable; >+ >+ // Skip the <root> node. >+ let firstNodeIndex = nodeFieldCount; >+ let firstNodeOrdinal = 1; >+ for (let nodeIndex = firstNodeIndex, nodeOrdinal = firstNodeOrdinal; nodeIndex < nodes.length; nodeIndex += nodeFieldCount, nodeOrdinal++) { >+ if (allowNodeIdentifierCallback && !allowNodeIdentifierCallback(nodes[nodeIndex + nodeIdOffset])) >+ continue; >+ >+ let classNameTableIndex = nodes[nodeIndex + nodeClassNameOffset]; >+ if (nodeClassNamesTable[classNameTableIndex] === className) >+ instances.push(nodeIndex); >+ } >+ >+ return instances.map(snapshot.serializeNode, snapshot); >+ } >+ >+ // Worker Methods >+ >+ allocationBucketCounts(bucketSizes) >+ { >+ return HeapSnapshot.allocationBucketCounts(this, bucketSizes); >+ } >+ >+ instancesWithClassName(className) >+ { >+ return HeapSnapshot.instancesWithClassName(this, className); >+ } >+ >+ update() >+ { >+ return HeapSnapshot.updateCategoriesAndMetadata(this); >+ } >+ >+ nodeWithIdentifier(nodeIdentifier) >+ { >+ let nodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ let nodeIndex = nodeOrdinal * nodeFieldCount; >+ return this.serializeNode(nodeIndex); >+ } >+ >+ shortestGCRootPath(nodeIdentifier) >+ { >+ // Returns an array from this node to a gcRoot node. >+ // E.g. [Node (target), Edge, Node, Edge, Node (root)]. >+ // Internal nodes are avoided, so if the path is empty this >+ // node is either a gcRoot or only reachable via Internal nodes. >+ >+ let paths = this._gcRootPaths(nodeIdentifier); >+ if (!paths.length) >+ return []; >+ >+ paths.sort((a, b) => a.length - b.length); >+ >+ let shortestPathWithGlobalObject = null; >+ for (let path of paths) { >+ let lastNodeIndex = path[path.length - 1].node; >+ if (this._isNodeGlobalObject(lastNodeIndex)) { >+ shortestPathWithGlobalObject = path; >+ break; >+ } >+ } >+ >+ let shortestPath = shortestPathWithGlobalObject || paths[0]; >+ console.assert("node" in shortestPath[0], "Path should start with a node"); >+ console.assert("node" in shortestPath[shortestPath.length - 1], "Path should end with a node"); >+ >+ return shortestPath.map((component) => { >+ if (component.node) >+ return this.serializeNode(component.node); >+ return this.serializeEdge(component.edge); >+ }); >+ } >+ >+ rootNodes() >+ { >+ let rootNodeIndexSet = new Set; >+ >+ // Identifiers can occur multiple times in the roots list. >+ for (let rootIndex = 0; rootIndex < this._roots.length; rootIndex += rootFieldCount) { >+ let rootOrdinal = rootIndex / rootFieldCount; >+ let rootIdentifier = this._roots[rootIndex + rootIdOffset]; >+ >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(rootIdentifier); >+ let toNodeIndex = toNodeOrdinal * nodeFieldCount; >+ >+ rootNodeIndexSet.add(toNodeIndex); >+ } >+ >+ return Array.from(rootNodeIndexSet.values()).map(this.serializeNode, this); >+ } >+ >+ reasonNamesForRoot(rootIdentifier) >+ { >+ let reasonIndexes = this._rootIdentifierToReasons.get(rootIdentifier); >+ if (!reasonIndexes) >+ return []; >+ return Array.from(reasonIndexes).map(this.labelForIndex, this).filter(a => a != 0) >+ } >+ >+ dominatedNodes(nodeIdentifier) >+ { >+ let dominatedNodes = []; >+ >+ let targetNodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ for (let nodeOrdinal = 0; nodeOrdinal < this._nodeCount; ++nodeOrdinal) { >+ if (this._nodeOrdinalToDominatorNodeOrdinal[nodeOrdinal] === targetNodeOrdinal) >+ dominatedNodes.push(nodeOrdinal * nodeFieldCount); >+ } >+ >+ return dominatedNodes.map(this.serializeNode, this); >+ } >+ >+ retainedNodes(nodeIdentifier) >+ { >+ let retainedNodes = []; >+ let edges = []; >+ >+ let nodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ let edgeIndex = this._nodeOrdinalToFirstOutgoingEdge[nodeOrdinal]; >+ for (; this._edges[edgeIndex + edgeFromIdOffset] === nodeIdentifier; edgeIndex += edgeFieldCount) { >+ let toNodeIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toNodeIdentifier); >+ let toNodeIndex = toNodeOrdinal * nodeFieldCount; >+ retainedNodes.push(toNodeIndex); >+ edges.push(edgeIndex); >+ } >+ >+ return { >+ retainedNodes: retainedNodes.map(this.serializeNode, this), >+ edges: edges.map(this.serializeEdge, this), >+ }; >+ } >+ >+ retainers(nodeIdentifier) >+ { >+ let retainers = []; >+ let edges = []; >+ >+ let nodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ let incomingEdgeIndex = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal]; >+ let incomingEdgeIndexEnd = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal + 1]; >+ for (let edgeIndex = incomingEdgeIndex; edgeIndex < incomingEdgeIndexEnd; ++edgeIndex) { >+ let fromNodeOrdinal = this._incomingNodes[edgeIndex]; >+ let fromNodeIndex = fromNodeOrdinal * nodeFieldCount; >+ retainers.push(fromNodeIndex); >+ edges.push(this._incomingEdges[edgeIndex]); >+ } >+ >+ return { >+ retainers: retainers.map(this.serializeNode, this), >+ edges: edges.map(this.serializeEdge, this), >+ }; >+ } >+ >+ updateDeadNodesAndGatherCollectionData(snapshots) >+ { >+ let previousSnapshotIndex = snapshots.indexOf(this) - 1; >+ let previousSnapshot = snapshots[previousSnapshotIndex]; >+ if (!previousSnapshot) >+ return null; >+ >+ let lastNodeIdentifier = previousSnapshot._lastNodeIdentifier; >+ >+ // All of the node identifiers that could have existed prior to this snapshot. >+ let known = new Map; >+ for (let nodeIndex = 0; nodeIndex < this._nodes.length; nodeIndex += nodeFieldCount) { >+ let nodeIdentifier = this._nodes[nodeIndex + nodeIdOffset]; >+ if (nodeIdentifier > lastNodeIdentifier) >+ continue; >+ known.set(nodeIdentifier, nodeIndex); >+ } >+ >+ // Determine which node identifiers have since been deleted. >+ let collectedNodesList = []; >+ for (let nodeIndex = 0; nodeIndex < previousSnapshot._nodes.length; nodeIndex += nodeFieldCount) { >+ let nodeIdentifier = previousSnapshot._nodes[nodeIndex + nodeIdOffset]; >+ let wasDeleted = !known.has(nodeIdentifier); >+ if (wasDeleted) >+ collectedNodesList.push(nodeIdentifier); >+ } >+ >+ // Update dead nodes in previous snapshots. >+ let affectedSnapshots = []; >+ for (let snapshot of snapshots) { >+ if (snapshot === this) >+ break; >+ if (snapshot._markDeadNodes(collectedNodesList)) >+ affectedSnapshots.push(snapshot._identifier); >+ } >+ >+ // Convert list to a map. >+ let collectedNodes = {}; >+ for (let i = 0; i < collectedNodesList.length; ++i) >+ collectedNodes[collectedNodesList[i]] = true; >+ >+ return { >+ collectedNodes, >+ affectedSnapshots, >+ }; >+ } >+ >+ // Public >+ >+ serialize() >+ { >+ return { >+ identifier: this._identifier, >+ title: this._title, >+ totalSize: this._totalSize, >+ totalObjectCount: this._nodeCount - 1, // <root>. >+ liveSize: this._liveSize, >+ categories: this._categories, >+ }; >+ } >+ >+ serializeNode(nodeIndex) >+ { >+ console.assert((nodeIndex % nodeFieldCount) === 0, "Invalid nodeIndex to serialize: " + nodeIndex); >+ >+ let nodeIdentifier = this._nodes[nodeIndex + nodeIdOffset]; >+ let nodeOrdinal = nodeIndex / nodeFieldCount; >+ let edgeIndex = this._nodeOrdinalToFirstOutgoingEdge[nodeOrdinal]; >+ let hasChildren = this._edges[edgeIndex + edgeFromIdOffset] === nodeIdentifier; >+ >+ let dominatorNodeOrdinal = this._nodeOrdinalToDominatorNodeOrdinal[nodeOrdinal]; >+ let dominatorNodeIndex = dominatorNodeOrdinal * nodeFieldCount; >+ let dominatorNodeIdentifier = this._nodes[dominatorNodeIndex + nodeIdOffset]; >+ >+ let result = { >+ id: nodeIdentifier, >+ className: this._nodeClassNamesTable[this._nodes[nodeIndex + nodeClassNameOffset]], >+ size: this._nodes[nodeIndex + nodeSizeOffset], >+ retainedSize: this._nodeOrdinalToRetainedSizes[nodeOrdinal], >+ internal: this._nodes[nodeIndex + nodeInternalOffset] ? true : false, >+ gcRoot: this._nodeOrdinalIsGCRoot[nodeOrdinal] ? true : false, >+ markedRoot : this._rootIdentifierToReasons.has(nodeIdentifier), >+ dead: this._nodeOrdinalIsDead[nodeOrdinal] ? true : false, >+ address: this._nodes[nodeIndex + nodeAddressOffset], >+ label: this._labelsTable[this._nodes[nodeIndex + nodeLabelOffset]], >+ dominatorNodeIdentifier, >+ hasChildren, >+ }; >+ >+ let wrappedAddr = this._nodes[nodeIndex + nodeWrappedAddressOffset]; >+ if (wrappedAddr !== "0x0") >+ result.wrappedAddress = wrappedAddr; >+ >+ return result; >+ } >+ >+ labelForIndex(index) >+ { >+ return this._labelsTable[index]; >+ } >+ >+ serializeEdge(edgeIndex) >+ { >+ console.assert((edgeIndex % edgeFieldCount) === 0, "Invalid edgeIndex to serialize"); >+ >+ let edgeType = this._edgeTypesTable[this._edges[edgeIndex + edgeTypeOffset]]; >+ let edgeData = this._edges[edgeIndex + edgeDataOffset]; >+ switch (edgeType) { >+ case "Internal": >+ // edgeData can be ignored. >+ break; >+ case "Property": >+ case "Variable": >+ // edgeData is a table index. >+ edgeData = this._edgeNamesTable[edgeData]; >+ break; >+ case "Index": >+ // edgeData is the index. >+ break; >+ default: >+ console.error("Unexpected edge type: " + edgeType); >+ break; >+ } >+ >+ return { >+ from: this._edges[edgeIndex + edgeFromIdOffset], >+ to: this._edges[edgeIndex + edgeToIdOffset], >+ type: edgeType, >+ data: edgeData, >+ }; >+ } >+ >+ // Private >+ >+ _buildOutgoingEdges() >+ { >+ let lastFromIdentifier = -1; >+ for (let edgeIndex = 0; edgeIndex < this._edges.length; edgeIndex += edgeFieldCount) { >+ let fromIdentifier = this._edges[edgeIndex + edgeFromIdOffset]; >+ console.assert(lastFromIdentifier <= fromIdentifier, "Edge list should be ordered by from node identifier"); >+ if (fromIdentifier !== lastFromIdentifier) { >+ let nodeOrdinal = this._nodeIdentifierToOrdinal.get(fromIdentifier); >+ this._nodeOrdinalToFirstOutgoingEdge[nodeOrdinal] = edgeIndex; >+ lastFromIdentifier = fromIdentifier; >+ } >+ } >+ } >+ >+ _buildIncomingEdges() >+ { >+ // First calculate the count of incoming edges for each node. >+ for (let edgeIndex = 0; edgeIndex < this._edges.length; edgeIndex += edgeFieldCount) { >+ let toIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toIdentifier); >+ this._nodeOrdinalToFirstIncomingEdge[toNodeOrdinal]++; >+ } >+ >+ // Replace the counts with what will be the resulting index by running up the counts. >+ // Store the counts in what will be the edges list to use when placing edges in the list. >+ let runningFirstIndex = 0; >+ for (let nodeOrdinal = 0; nodeOrdinal < this._nodeCount; ++nodeOrdinal) { >+ let count = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal]; >+ this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal] = runningFirstIndex; >+ this._incomingNodes[runningFirstIndex] = count; >+ runningFirstIndex += count; >+ } >+ >+ // Fill in the incoming edges list. Use the count as an offset when placing edges in the list. >+ for (let edgeIndex = 0; edgeIndex < this._edges.length; edgeIndex += edgeFieldCount) { >+ let fromIdentifier = this._edges[edgeIndex + edgeFromIdOffset]; >+ let fromNodeOrdinal = this._nodeIdentifierToOrdinal.get(fromIdentifier); >+ let toIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toIdentifier); >+ >+ let firstIncomingEdgeIndex = this._nodeOrdinalToFirstIncomingEdge[toNodeOrdinal]; >+ console.assert(this._incomingNodes[firstIncomingEdgeIndex] > 0, "Should be expecting edges for this node"); >+ let countAsOffset = this._incomingNodes[firstIncomingEdgeIndex]--; >+ let index = firstIncomingEdgeIndex + countAsOffset - 1; >+ this._incomingNodes[index] = fromNodeOrdinal; >+ this._incomingEdges[index] = edgeIndex; >+ } >+ >+ // Duplicate value on the end. Incoming edge iteration walks firstIncomingEdge(ordinal) to firstIncomingEdge(ordinal+1). >+ this._nodeOrdinalToFirstIncomingEdge[this._nodeCount] = this._nodeOrdinalToFirstIncomingEdge[this._nodeCount - 1]; >+ } >+ >+ _buildPostOrderIndexes() >+ { >+ let postOrderIndex = 0; >+ let nodeOrdinalToPostOrderIndex = new Uint32Array(this._nodeCount); >+ let postOrderIndexToNodeOrdinal = new Uint32Array(this._nodeCount); >+ >+ let stackNodes = new Uint32Array(this._nodeCount); // nodeOrdinal. >+ let stackEdges = new Uint32Array(this._nodeCount); // edgeIndex. >+ let visited = new Uint8Array(this._nodeCount); >+ >+ let stackTop = 0; >+ stackNodes[stackTop] = rootNodeOrdinal; >+ stackEdges[stackTop] = this._nodeOrdinalToFirstOutgoingEdge[rootNodeOrdinal]; >+ >+ while (stackTop >= 0) { >+ let nodeOrdinal = stackNodes[stackTop]; >+ let nodeIdentifier = this._nodes[(nodeOrdinal * nodeFieldCount) + nodeIdOffset]; >+ let edgeIndex = stackEdges[stackTop]; >+ >+ if (this._edges[edgeIndex + edgeFromIdOffset] === nodeIdentifier) { >+ // Prepare the next child for the current node. >+ stackEdges[stackTop] += edgeFieldCount; >+ >+ let toIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toIdentifier); >+ if (visited[toNodeOrdinal]) >+ continue; >+ >+ // Child. >+ stackTop++; >+ stackNodes[stackTop] = toNodeOrdinal; >+ stackEdges[stackTop] = this._nodeOrdinalToFirstOutgoingEdge[toNodeOrdinal]; >+ visited[toNodeOrdinal] = 1; >+ } else { >+ // Self. >+ nodeOrdinalToPostOrderIndex[nodeOrdinal] = postOrderIndex; >+ postOrderIndexToNodeOrdinal[postOrderIndex] = nodeOrdinal; >+ postOrderIndex++; >+ stackTop--; >+ } >+ } >+ >+ // Unvisited nodes. >+ // This can happen if the parent node was disallowed on the backend, but other nodes >+ // that were only referenced from that disallowed node were eventually allowed because >+ // they may be generic system objects. Give these nodes a postOrderIndex anyways. >+ if (postOrderIndex !== this._nodeCount) { >+ // Root was the last node visited. Revert assigning it an index, add it back at the end. >+ postOrderIndex--; >+ >+ // Visit unvisited nodes. >+ for (let nodeOrdinal = 1; nodeOrdinal < this._nodeCount; ++nodeOrdinal) { >+ if (visited[nodeOrdinal]) >+ continue; >+ nodeOrdinalToPostOrderIndex[nodeOrdinal] = postOrderIndex; >+ postOrderIndexToNodeOrdinal[postOrderIndex] = nodeOrdinal; >+ postOrderIndex++; >+ } >+ >+ // Visit root again. >+ nodeOrdinalToPostOrderIndex[rootNodeOrdinal] = postOrderIndex; >+ postOrderIndexToNodeOrdinal[postOrderIndex] = rootNodeOrdinal; >+ postOrderIndex++; >+ } >+ >+ console.assert(postOrderIndex === this._nodeCount, "All nodes were visited"); >+ console.assert(nodeOrdinalToPostOrderIndex[rootNodeOrdinal] === this._nodeCount - 1, "Root node should have the last possible postOrderIndex"); >+ >+ return {nodeOrdinalToPostOrderIndex, postOrderIndexToNodeOrdinal}; >+ } >+ >+ _buildDominatorIndexes(nodeOrdinalToPostOrderIndex, postOrderIndexToNodeOrdinal) >+ { >+ // The algorithm is based on the article: >+ // K. Cooper, T. Harvey and K. Kennedy "A Simple, Fast Dominance Algorithm" >+ >+ let rootPostOrderIndex = this._nodeCount - 1; >+ let noEntry = this._nodeCount; >+ >+ let affected = new Uint8Array(this._nodeCount); >+ let dominators = new Uint32Array(this._nodeCount); >+ >+ // Initialize with unset value. >+ dominators.fill(noEntry); >+ >+ // Mark the root's dominator value. >+ dominators[rootPostOrderIndex] = rootPostOrderIndex; >+ >+ // Affect the root's children. Also use this opportunity to mark them as GC roots. >+ let rootEdgeIndex = this._nodeOrdinalToFirstOutgoingEdge[rootNodeOrdinal]; >+ for (let edgeIndex = rootEdgeIndex; this._edges[edgeIndex + edgeFromIdOffset] === rootNodeIdentifier; edgeIndex += edgeFieldCount) { >+ let toIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toIdentifier); >+ let toPostOrderIndex = nodeOrdinalToPostOrderIndex[toNodeOrdinal]; >+ affected[toPostOrderIndex] = 1; >+ this._nodeOrdinalIsGCRoot[toNodeOrdinal] = 1; >+ } >+ >+ let changed = true; >+ while (changed) { >+ changed = false; >+ >+ for (let postOrderIndex = rootPostOrderIndex - 1; postOrderIndex >= 0; --postOrderIndex) { >+ if (!affected[postOrderIndex]) >+ continue; >+ affected[postOrderIndex] = 0; >+ >+ // The dominator is already the root, nothing to do. >+ if (dominators[postOrderIndex] === rootPostOrderIndex) >+ continue; >+ >+ let newDominatorIndex = noEntry; >+ let nodeOrdinal = postOrderIndexToNodeOrdinal[postOrderIndex]; >+ let incomingEdgeIndex = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal]; >+ let incomingEdgeIndexEnd = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal + 1]; >+ for (let edgeIndex = incomingEdgeIndex; edgeIndex < incomingEdgeIndexEnd; ++edgeIndex) { >+ let fromNodeOrdinal = this._incomingNodes[edgeIndex]; >+ let fromPostOrderIndex = nodeOrdinalToPostOrderIndex[fromNodeOrdinal]; >+ if (dominators[fromPostOrderIndex] !== noEntry) { >+ if (newDominatorIndex === noEntry) >+ newDominatorIndex = fromPostOrderIndex; >+ else { >+ while (fromPostOrderIndex !== newDominatorIndex) { >+ while (fromPostOrderIndex < newDominatorIndex) >+ fromPostOrderIndex = dominators[fromPostOrderIndex]; >+ while (newDominatorIndex < fromPostOrderIndex) >+ newDominatorIndex = dominators[newDominatorIndex]; >+ } >+ } >+ } >+ if (newDominatorIndex === rootPostOrderIndex) >+ break; >+ } >+ >+ // Changed. Affect children. >+ if (newDominatorIndex !== noEntry && dominators[postOrderIndex] !== newDominatorIndex) { >+ dominators[postOrderIndex] = newDominatorIndex; >+ changed = true; >+ >+ let outgoingEdgeIndex = this._nodeOrdinalToFirstOutgoingEdge[nodeOrdinal]; >+ let nodeIdentifier = this._nodes[(nodeOrdinal * nodeFieldCount) + nodeIdOffset]; >+ for (let edgeIndex = outgoingEdgeIndex; this._edges[edgeIndex + edgeFromIdOffset] === nodeIdentifier; edgeIndex += edgeFieldCount) { >+ let toNodeIdentifier = this._edges[edgeIndex + edgeToIdOffset]; >+ let toNodeOrdinal = this._nodeIdentifierToOrdinal.get(toNodeIdentifier); >+ let toNodePostOrder = nodeOrdinalToPostOrderIndex[toNodeOrdinal]; >+ affected[toNodePostOrder] = 1; >+ } >+ } >+ } >+ } >+ >+ for (let postOrderIndex = 0; postOrderIndex < this._nodeCount; ++postOrderIndex) { >+ let nodeOrdinal = postOrderIndexToNodeOrdinal[postOrderIndex]; >+ let dominatorNodeOrdinal = postOrderIndexToNodeOrdinal[dominators[postOrderIndex]]; >+ this._nodeOrdinalToDominatorNodeOrdinal[nodeOrdinal] = dominatorNodeOrdinal; >+ } >+ } >+ >+ _buildRetainedSizes(postOrderIndexToNodeOrdinal) >+ { >+ // Self size. >+ for (let nodeIndex = 0, nodeOrdinal = 0; nodeOrdinal < this._nodeCount; nodeIndex += nodeFieldCount, nodeOrdinal++) >+ this._nodeOrdinalToRetainedSizes[nodeOrdinal] = this._nodes[nodeIndex + nodeSizeOffset]; >+ >+ // Attribute size to dominator. >+ for (let postOrderIndex = 0; postOrderIndex < this._nodeCount - 1; ++postOrderIndex) { >+ let nodeOrdinal = postOrderIndexToNodeOrdinal[postOrderIndex]; >+ let nodeRetainedSize = this._nodeOrdinalToRetainedSizes[nodeOrdinal]; >+ let dominatorNodeOrdinal = this._nodeOrdinalToDominatorNodeOrdinal[nodeOrdinal]; >+ this._nodeOrdinalToRetainedSizes[dominatorNodeOrdinal] += nodeRetainedSize; >+ } >+ } >+ >+ _markDeadNodes(collectedNodesList) >+ { >+ let affected = false; >+ >+ for (let i = 0; i < collectedNodesList.length; ++i) { >+ let nodeIdentifier = collectedNodesList[i]; >+ if (nodeIdentifier > this._lastNodeIdentifier) >+ continue; >+ let nodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ this._nodeOrdinalIsDead[nodeOrdinal] = 1; >+ affected = true; >+ } >+ >+ return affected; >+ } >+ >+ _isNodeGlobalObject(nodeIndex) >+ { >+ let className = this._nodeClassNamesTable[this._nodes[nodeIndex + nodeClassNameOffset]]; >+ return className === "Window" >+ || className === "JSWindowProxy" >+ || className === "GlobalObject"; >+ } >+ >+ _gcRootPaths(nodeIdentifier) >+ { >+ let targetNodeOrdinal = this._nodeIdentifierToOrdinal.get(nodeIdentifier); >+ >+ if (this._nodeOrdinalIsGCRoot[targetNodeOrdinal]) >+ return []; >+ >+ // FIXME: Array push/pop can affect performance here, but in practice it hasn't been an issue. >+ >+ let paths = []; >+ let currentPath = []; >+ let visited = new Uint8Array(this._nodeCount); >+ >+ function visitNode(nodeOrdinal) >+ { >+ if (this._nodeOrdinalIsGCRoot[nodeOrdinal]) { >+ let fullPath = currentPath.slice(); >+ let nodeIndex = nodeOrdinal * nodeFieldCount; >+ fullPath.push({node: nodeIndex}); >+ paths.push(fullPath); >+ return; >+ } >+ >+ if (visited[nodeOrdinal]) >+ return; >+ visited[nodeOrdinal] = 1; >+ >+ let nodeIndex = nodeOrdinal * nodeFieldCount; >+ currentPath.push({node: nodeIndex}); >+ >+ // Loop in reverse order because edges were added in reverse order. >+ // It doesn't particularly matter other then consistency with previous code. >+ let incomingEdgeIndexStart = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal]; >+ let incomingEdgeIndexEnd = this._nodeOrdinalToFirstIncomingEdge[nodeOrdinal + 1]; >+ for (let incomingEdgeIndex = incomingEdgeIndexEnd - 1; incomingEdgeIndex >= incomingEdgeIndexStart; --incomingEdgeIndex) { >+ let fromNodeOrdinal = this._incomingNodes[incomingEdgeIndex]; >+ let fromNodeIndex = fromNodeOrdinal * nodeFieldCount; >+ // let fromNodeIsInternal = this._nodes[fromNodeIndex + nodeInternalOffset]; >+ // if (fromNodeIsInternal) >+ // continue; >+ >+ let edgeIndex = this._incomingEdges[incomingEdgeIndex]; >+ currentPath.push({edge: edgeIndex}); >+ visitNode.call(this, fromNodeOrdinal); >+ currentPath.pop(); >+ } >+ >+ currentPath.pop(); >+ } >+ >+ visitNode.call(this, targetNodeOrdinal); >+ >+ return paths; >+ } >+}; >+ >+HeapSnapshotDiff = class HeapSnapshotDiff >+{ >+ constructor(objectId, snapshot1, snapshot2) >+ { >+ this._objectId = objectId; >+ >+ this._snapshot1 = snapshot1; >+ this._snapshot2 = snapshot2; >+ >+ this._totalSize = 0; >+ this._addedNodeIdentifiers = new Set; >+ >+ let known = new Map; >+ for (let nodeIndex = 0; nodeIndex < this._snapshot1._nodes.length; nodeIndex += nodeFieldCount) { >+ let nodeIdentifier = this._snapshot1._nodes[nodeIndex + nodeIdOffset]; >+ known.set(nodeIdentifier, nodeIndex); >+ } >+ >+ for (let nodeIndex = 0; nodeIndex < this._snapshot2._nodes.length; nodeIndex += nodeFieldCount) { >+ let nodeIdentifier = this._snapshot2._nodes[nodeIndex + nodeIdOffset]; >+ let existed = known.delete(nodeIdentifier); >+ if (!existed) { >+ this._addedNodeIdentifiers.add(nodeIdentifier); >+ this._totalSize += this._snapshot2._nodes[nodeIndex + nodeSizeOffset]; >+ } >+ } >+ >+ let {liveSize, categories} = HeapSnapshot.updateCategoriesAndMetadata(this._snapshot2, (nodeIdentifier) => this._addedNodeIdentifiers.has(nodeIdentifier)); >+ this._categories = categories; >+ } >+ >+ // Worker Methods >+ >+ allocationBucketCounts(bucketSizes) >+ { >+ return HeapSnapshot.allocationBucketCounts(this._snapshot2, bucketSizes, (nodeIdentifier) => this._addedNodeIdentifiers.has(nodeIdentifier)); >+ } >+ >+ instancesWithClassName(className) >+ { >+ return HeapSnapshot.instancesWithClassName(this._snapshot2, className, (nodeIdentifier) => this._addedNodeIdentifiers.has(nodeIdentifier)); >+ } >+ >+ update() >+ { >+ return HeapSnapshot.updateCategoriesAndMetadata(this._snapshot2, (nodeIdentifier) => this._addedNodeIdentifiers.has(nodeIdentifier)); >+ } >+ >+ nodeWithIdentifier(nodeIdentifier) { return this._snapshot2.nodeWithIdentifier(nodeIdentifier); } >+ shortestGCRootPath(nodeIdentifier) { return this._snapshot2.shortestGCRootPath(nodeIdentifier); } >+ dominatedNodes(nodeIdentifier) { return this._snapshot2.dominatedNodes(nodeIdentifier); } >+ retainedNodes(nodeIdentifier) { return this._snapshot2.retainedNodes(nodeIdentifier); } >+ retainers(nodeIdentifier) { return this._snapshot2.retainers(nodeIdentifier); } >+ >+ // Public >+ >+ serialize() >+ { >+ return { >+ snapshot1: this._snapshot1.serialize(), >+ snapshot2: this._snapshot2.serialize(), >+ totalSize: this._totalSize, >+ totalObjectCount: this._addedNodeIdentifiers.size, >+ categories: this._categories, >+ }; >+ } >+}; >diff --git a/Tools/GCHeapInspector/script/interface.js b/Tools/GCHeapInspector/script/interface.js >new file mode 100644 >index 0000000000000000000000000000000000000000..26e679309fec16aac9b3b3e9bcde9566b06f87b6 >--- /dev/null >+++ b/Tools/GCHeapInspector/script/interface.js >@@ -0,0 +1,515 @@ >+ >+ >+// DOM Helpers >+class DOMUtils >+{ >+ static removeAllChildren(node) >+ { >+ while (node.lastChild) >+ node.removeChild(node.lastChild); >+ } >+ >+ static createDetails(summaryText) >+ { >+ let summary = document.createElement('summary'); >+ summary.textContent = summaryText; >+ >+ let details = document.createElement('details'); >+ details.appendChild(summary); >+ >+ details.addEventListener('keydown', function(event) { >+ const rightArrowKeyCode = 39; >+ const leftArrowKeyCode = 37; >+ if (event.keyCode == rightArrowKeyCode) >+ this.open = true; >+ else if (event.keyCode == leftArrowKeyCode) >+ this.open = false; >+ }, false); >+ >+ return details; >+ } >+}; >+ >+// Heap Inspector Helpers >+class HeapInspectorUtils >+{ >+ static humanReadableSize(sizeInBytes) >+ { >+ var i = -1; >+ if (sizeInBytes < 512) >+ return sizeInBytes + ' B'; >+ var byteUnits = [' KB', ' MB', ' GB']; >+ do { >+ sizeInBytes = sizeInBytes / 1024; >+ i++; >+ } while (sizeInBytes > 1024); >+ >+ return Math.max(sizeInBytes, 0.1).toFixed(1) + byteUnits[i]; >+ } >+ >+ static addressForNode(node) >+ { >+ return node.wrappedAddress ? node.wrappedAddress : node.address; >+ } >+ >+ static nodeName(snapshot, node) >+ { >+ if (node.type == "Internal") >+ return 'Internal node'; >+ >+ let result = node.className + ' @' + node.id + ' (' + HeapInspectorUtils.addressForNode(node) + ' ' + node.label + ')'; >+ if (node.gcRoot || node.markedRoot) >+ result += ' (GC rootâ' + snapshot.reasonNamesForRoot(node.id).join(', ') + ')'; >+ >+ return result; >+ } >+ >+ static spanForNode(inspector, node, showPathButton) >+ { >+ let nodeSpan = document.createElement('span'); >+ >+ if (node.type == "Internal") { >+ nodeSpan.textContent = 'Internal node'; >+ return nodeSpan; >+ } >+ >+ let wrappedAddressString = node.wrappedAddress ? `wrapped ${node.wrappedAddress}` : ''; >+ >+ let nodeHTML = node.className + ` <span class="node-id">${node.id}</span> <span class="node-address">cell ${node.address} ${wrappedAddressString}</span> <span class="node-size">(retains ${HeapInspectorUtils.humanReadableSize(node.retainedSize)})</span>`; >+ >+ if (node.label.length) >+ nodeHTML += ` <span class="node-label">â${node.label}â</span>`; >+ >+ nodeSpan.innerHTML = nodeHTML; >+ >+ if (node.gcRoot || node.markedRoot) { >+ let gcRootSpan = document.createElement('span'); >+ gcRootSpan.className = 'node-gc-root'; >+ gcRootSpan.textContent = ' (GC rootâ' + inspector.snapshot.reasonNamesForRoot(node.id).join(', ') + ')'; >+ nodeSpan.appendChild(gcRootSpan); >+ } else if (showPathButton) { >+ let showAllPathsAnchor = document.createElement('button'); >+ showAllPathsAnchor.className = 'node-show-all-paths'; >+ showAllPathsAnchor.textContent = 'Show all paths'; >+ showAllPathsAnchor.addEventListener('click', function(e) { >+ inspector.showAllPathsToNode(node); >+ }, false); >+ nodeSpan.appendChild(showAllPathsAnchor); >+ } >+ >+ return nodeSpan; >+ } >+ >+ static spanForEdge(snapshot, edge) >+ { >+ let edgeSpan = document.createElement('span'); >+ edgeSpan.className = 'edge'; >+ edgeSpan.innerHTML = '<span class="edge-type">' + edge.type + '</span> <span class="edge-data">' + edge.data + '</span>'; >+ return edgeSpan; >+ } >+ >+ static summarySpanForPath(inspector, path) >+ { >+ let pathSpan = document.createElement('span'); >+ pathSpan.className = 'path-summary'; >+ >+ if (path.length > 0) { >+ let pathLength = (path.length - 1) / 2; >+ pathSpan.textContent = pathLength + ' step' + (pathLength > 1 ? 's' : '') + ' from '; >+ pathSpan.appendChild(HeapInspectorUtils.spanForNode(inspector, path[0]), true); >+ } >+ >+ return pathSpan; >+ } >+ >+ static edgeName(edge) >+ { >+ return 'â ' + edge.type + ' ' + edge.data + ' â'; >+ } >+}; >+ >+ >+// Manages a list of heap snapshot nodes that can dynamically build the contents of an HTMLListElement. >+class InstanceList >+{ >+ constructor(listElement, snapshot, listGeneratorFunc) >+ { >+ this.listElement = listElement; >+ this.snapshot = snapshot; >+ this.nodeList = listGeneratorFunc(this.snapshot); >+ this.entriesAdded = 0; >+ this.initialEntries = 100; >+ this.entriesQuantum = 50; >+ this.showMoreItem = undefined; >+ } >+ >+ buildList() >+ { >+ DOMUtils.removeAllChildren(this.listElement); >+ if (this.nodeList.length == 0) >+ return; >+ >+ let maxIndex = Math.min(this.nodeList.length, this.initialEntries); >+ this.appendItemsForRange(0, maxIndex); >+ >+ if (maxIndex < this.nodeList.length) { >+ this.showMoreItem = this.makeShowMoreItem(); >+ this.listElement.appendChild(this.showMoreItem); >+ } >+ >+ this.entriesAdded = maxIndex; >+ } >+ >+ appendItemsForRange(startIndex, endIndex) >+ { >+ for (let index = startIndex; index < endIndex; ++index) { >+ let instance = this.nodeList[index]; >+ let listItem = document.createElement('li'); >+ listItem.appendChild(HeapInspectorUtils.spanForNode(this, instance, true)); >+ this.listElement.appendChild(listItem); >+ } >+ >+ this.entriesAdded = endIndex; >+ } >+ >+ appendMoreEntries() >+ { >+ let numRemaining = this.nodeList.length - this.entriesAdded; >+ if (numRemaining == 0) >+ return; >+ >+ this.showMoreItem.remove(); >+ >+ let fromIndex = this.entriesAdded; >+ let toIndex = Math.min(this.nodeList.length, fromIndex + this.entriesQuantum); >+ this.appendItemsForRange(fromIndex, toIndex); >+ >+ if (toIndex < this.nodeList.length) { >+ this.showMoreItem = this.makeShowMoreItem(); >+ this.listElement.appendChild(this.showMoreItem); >+ } >+ } >+ >+ makeShowMoreItem() >+ { >+ let numberRemaining = this.nodeList.length - this.entriesAdded; >+ >+ let listItem = document.createElement('li'); >+ listItem.className = 'show-more'; >+ listItem.appendChild(document.createTextNode(`${numberRemaining} more `)); >+ >+ let moreButton = document.createElement('button'); >+ moreButton.textContent = `Show ${Math.min(this.entriesQuantum, numberRemaining)} more`; >+ >+ let thisList = this; >+ moreButton.addEventListener('click', function(e) { >+ thisList.appendMoreEntries(10); >+ }, false); >+ >+ listItem.appendChild(moreButton); >+ return listItem; >+ } >+}; >+ >+ >+class HeapSnapshotInspector >+{ >+ constructor(containerElement, heapJSONData, filename) >+ { >+ this.containerElement = containerElement; >+ this.resetUI(); >+ >+ this.snapshot = new HeapSnapshot(1, heapJSONData, filename); >+ >+ this.buildRoots(); >+ this.buildAllObjectsByType(); >+ >+ this.buildPathsToRootsOfType('Window'); >+ this.buildPathsToRootsOfType('HTMLDocument'); >+ } >+ >+ resetUI() >+ { >+ DOMUtils.removeAllChildren(this.containerElement); >+ >+ this.objectByTypeContainer = document.createElement('section'); >+ this.objectByTypeContainer.id = 'all-objects-by-type'; >+ >+ let header = document.createElement('h1'); >+ header.textContent = 'All Objects by Type' >+ this.objectByTypeContainer.appendChild(header); >+ >+ this.rootsContainer = document.createElement('section'); >+ this.rootsContainer.id = 'roots'; >+ header = document.createElement('h1'); >+ header.textContent = 'Roots' >+ this.rootsContainer.appendChild(header); >+ >+ this.pathsToRootsContainer = document.createElement('section'); >+ this.pathsToRootsContainer.id = 'paths-to-roots'; >+ header = document.createElement('h1'); >+ header.textContent = 'Paths to roots' >+ this.pathsToRootsContainer.appendChild(header); >+ >+ this.allPathsContainer = document.createElement('section'); >+ this.allPathsContainer.id = 'all-paths'; >+ header = document.createElement('h1'); >+ header.textContent = 'All paths toâ¦' >+ this.allPathsContainer.appendChild(header); >+ >+ this.containerElement.appendChild(this.pathsToRootsContainer); >+ this.containerElement.appendChild(this.allPathsContainer); >+ this.containerElement.appendChild(this.rootsContainer); >+ this.containerElement.appendChild(this.objectByTypeContainer); >+ } >+ >+ buildAllObjectsByType() >+ { >+ let categories = this.snapshot._categories; >+ let categoryNames = Object.keys(categories).sort(); >+ >+ for (var categoryName of categoryNames) { >+ let category = categories[categoryName]; >+ >+ let details = DOMUtils.createDetails(`${category.className} (${category.count})`); >+ >+ let instanceListElement = document.createElement('ul'); >+ instanceListElement.className = 'instance-list'; >+ >+ let instanceList = new InstanceList(instanceListElement, this.snapshot, function(snapshot) { >+ return HeapSnapshot.instancesWithClassName(snapshot, categoryName); >+ }); >+ >+ instanceList.buildList(); >+ >+ details.appendChild(instanceListElement); >+ this.objectByTypeContainer.appendChild(details); >+ } >+ } >+ >+ buildRoots() >+ { >+ let roots = this.snapshot.rootNodes(); >+ if (roots.length == 0) >+ return; >+ >+ let groupings = roots.reduce(function(accumulator, node) { >+ var key = node.className; >+ if (!accumulator[key]) { >+ accumulator[key] = []; >+ } >+ accumulator[key].push(node); >+ return accumulator; >+ }, {}); >+ >+ let rootNames = Object.keys(groupings).sort(); >+ >+ for (var rootClassName of rootNames) { >+ let rootsOfType = groupings[rootClassName]; >+ >+ rootsOfType.sort(function(a, b) { >+ let addressA = HeapInspectorUtils.addressForNode(a); >+ let addressB = HeapInspectorUtils.addressForNode(b); >+ return (addressA < addressB) ? -1 : (addressA > addressB) ? 1 : 0; >+ }) >+ >+ let details = DOMUtils.createDetails(`${rootClassName} (${rootsOfType.length})`); >+ let rootsTypeList = document.createElement('ul') >+ rootsTypeList.className = 'instance-list'; >+ >+ for (let root of rootsOfType) { >+ let rootListItem = document.createElement('li'); >+ rootListItem.appendChild(HeapInspectorUtils.spanForNode(this, root, true)); >+ rootsTypeList.appendChild(rootListItem); >+ } >+ >+ details.appendChild(rootsTypeList); >+ >+ this.rootsContainer.appendChild(details); >+ } >+ } >+ >+ buildPathsToRootsOfType(type) >+ { >+ let instances = HeapSnapshot.instancesWithClassName(this.snapshot, type); >+ if (instances.length == 0) >+ return; >+ >+ let header = document.createElement('h2'); >+ header.textContent = 'Shortest paths to all ' + type + 's'; >+ >+ let detailsContainer = document.createElement('section') >+ detailsContainer.className = 'path'; >+ >+ for (var instance of instances) { >+ let shortestPath = this.snapshot.shortestGCRootPath(instance.id).reverse(); >+ >+ let details = DOMUtils.createDetails(''); >+ let summary = details.firstChild; >+ summary.appendChild(HeapInspectorUtils.spanForNode(this, instance, true)); >+ summary.appendChild(document.createTextNode('â')); >+ summary.appendChild(HeapInspectorUtils.summarySpanForPath(this, shortestPath)); >+ >+ let pathList = document.createElement('ul'); >+ pathList.className = 'path'; >+ >+ let isNode = true; >+ let currItem = undefined; >+ for (let item of shortestPath) { >+ if (isNode) { >+ currItem = document.createElement('li'); >+ currItem.appendChild(HeapInspectorUtils.spanForNode(this, item)); >+ pathList.appendChild(currItem); >+ } else { >+ currItem.appendChild(HeapInspectorUtils.spanForEdge(this.snapshot, item)); >+ currItem = undefined; >+ } >+ isNode = !isNode; >+ } >+ >+ details.appendChild(pathList); >+ detailsContainer.appendChild(details); >+ } >+ >+ this.pathsToRootsContainer.appendChild(header); >+ this.pathsToRootsContainer.appendChild(detailsContainer); >+ } >+ >+ showAllPathsToNode(node) >+ { >+ let paths = this.snapshot._gcRootPaths(node.id); >+ >+ let details = DOMUtils.createDetails(''); >+ let summary = details.firstChild; >+ summary.appendChild(document.createTextNode(`${paths.length} path${paths.length > 1 ? 's' : ''} to `)); >+ summary.appendChild(HeapInspectorUtils.spanForNode(this, node, false)); >+ >+ let detailsContainer = document.createElement('section') >+ detailsContainer.className = 'path'; >+ >+ for (let path of paths) { >+ let pathNodes = path.map((component) => { >+ if (component.node) >+ return this.snapshot.serializeNode(component.node); >+ return this.snapshot.serializeEdge(component.edge); >+ }).reverse(); >+ >+ let pathDetails = DOMUtils.createDetails(''); >+ let pathSummary = pathDetails.firstChild; >+ pathSummary.appendChild(HeapInspectorUtils.summarySpanForPath(this, pathNodes)); >+ >+ let pathList = document.createElement('ul'); >+ pathList.className = 'path'; >+ >+ let isNode = true; >+ let currItem = undefined; >+ for (let item of pathNodes) { >+ if (isNode) { >+ currItem = document.createElement('li'); >+ currItem.appendChild(HeapInspectorUtils.spanForNode(this, item)); >+ pathList.appendChild(currItem); >+ } else { >+ currItem.appendChild(HeapInspectorUtils.spanForEdge(this.snapshot, item)); >+ currItem = undefined; >+ } >+ isNode = !isNode; >+ } >+ >+ pathDetails.appendChild(pathList); >+ detailsContainer.appendChild(pathDetails); >+ } >+ >+ details.appendChild(detailsContainer); >+ this.allPathsContainer.appendChild(details); >+ } >+ >+}; >+ >+ >+function loadResults(dataString, filename) >+{ >+ let inspectorContainer = document.getElementById('uiContainer'); >+ inspector = new HeapSnapshotInspector(inspectorContainer, dataString, filename) >+} >+ >+function filenameForPath(filepath) >+{ >+ return filepath.match(/([^\/]+)(?=\.\w+$)/)[0]; >+} >+ >+function hideDescription() >+{ >+ document.getElementById('description').classList.add('hidden'); >+} >+ >+var inspector; >+ >+function setupInterface() >+{ >+ // See if we have a file to load specified in the query string. >+ var query_parameters = {}; >+ var pairs = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); >+ var filename = "test-heap.json"; >+ >+ for (var i = 0; i < pairs.length; i++) { >+ var pair = pairs[i].split('='); >+ query_parameters[pair[0]] = decodeURIComponent(pair[1]); >+ } >+ >+ if ("filename" in query_parameters) >+ filename = query_parameters["filename"]; >+ >+ fetch(filename) >+ .then(function(response) { >+ if (response.ok) >+ return response.text(); >+ throw new Error('Failed to load data file ' + filename); >+ }) >+ .then(function(dataString) { >+ loadResults(dataString, filenameForPath(filename)); >+ hideDescription(); >+ document.getElementById('uiContainer').style.display = 'block'; >+ }); >+ >+ var drop_target = document.getElementById("dropTarget"); >+ >+ drop_target.addEventListener("dragenter", function (e) { >+ drop_target.className = "dragOver"; >+ e.stopPropagation(); >+ e.preventDefault(); >+ }, false); >+ >+ drop_target.addEventListener("dragover", function (e) { >+ e.stopPropagation(); >+ e.preventDefault(); >+ }, false); >+ >+ drop_target.addEventListener("dragleave", function (e) { >+ drop_target.className = ""; >+ e.stopPropagation(); >+ e.preventDefault(); >+ }, false); >+ >+ drop_target.addEventListener("drop", function (e) { >+ drop_target.className = ""; >+ e.stopPropagation(); >+ e.preventDefault(); >+ >+ for (var i = 0; i < e.dataTransfer.files.length; ++i) { >+ var file = e.dataTransfer.files[i]; >+ >+ var reader = new FileReader(); >+ reader.filename = file.name; >+ reader.onload = function(e) { >+ loadResults(e.target.result, filenameForPath(this.filename)); >+ hideDescription(); >+ document.getElementById('uiContainer').style.display = 'block'; >+ }; >+ >+ reader.readAsText(file); >+ document.title = "GC Heap: " + reader.filename; >+ } >+ }, false); >+} >+ >+window.addEventListener('load', setupInterface, false); >diff --git a/Tools/GCHeapInspector/test-heap.json b/Tools/GCHeapInspector/test-heap.json >new file mode 100644 >index 0000000000000000000000000000000000000000..a6b875b0f44307b9b8bcf48f159bf5a1a56d5d3a >--- /dev/null >+++ b/Tools/GCHeapInspector/test-heap.json >@@ -0,0 +1 @@ >+{"version":1,"type":"GCDebugging","nodes":[0,0,0,0,0,"0x0","0x0",1132,224,1,1,0,"0x12408c000","0x0",329,4078,2,0,1,"0x1241e6f10","0x0",1179,80,3,1,0,"0x1241ea670","0x0",1731,80,3,1,0,"0x1241ea6c0","0x0",1332,80,3,1,0,"0x1241ea710","0x0",1431,80,3,1,0,"0x1241ea760","0x0",791,80,3,1,0,"0x1241ea7b0","0x0",1455,80,3,1,0,"0x1241ea800","0x0",795,80,3,1,0,"0x1241ea850","0x0",1819,80,3,1,0,"0x1241ea8a0","0x0",825,80,3,1,0,"0x1241ea8f0","0x0",56,48,4,0,0,"0x124854000","0x0",2369,16,5,1,0,"0x12485c0d0","0x0",2373,16,5,1,0,"0x12485c0e0","0x0",2374,16,5,1,0,"0x12485c0f0","0x0",2375,16,5,1,0,"0x12485c100","0x0",2376,16,5,1,0,"0x12485c110","0x0",2377,16,5,1,0,"0x12485c120","0x0",2381,16,5,1,0,"0x12485c130","0x0",2384,16,5,1,0,"0x12485c140","0x0",2386,16,5,1,0,"0x12485c150","0x0",2388,16,5,1,0,"0x12485c160","0x0",2389,16,5,1,0,"0x12485c170","0x0",2390,16,5,1,0,"0x12485c180","0x0",924,67,6,0,0,"0x124887e00","0x0",1814,96,7,1,0,"0x124894000","0x0",1822,96,7,1,0,"0x124894060","0x0",1828,96,7,1,0,"0x1248940c0","0x0",497,96,7,1,0,"0x124894120","0x0",500,96,7,1,0,"0x124894180","0x0",503,96,7,1,0,"0x1248941e0","0x0",506,96,7,1,0,"0x124894240","0x0",509,96,7,1,0,"0x1248942a0","0x0",512,96,7,1,0,"0x124894300","0x0",515,96,7,1,0,"0x124894360","0x0",518,96,7,1,0,"0x1248943c0","0x0",521,96,7,1,0,"0x124894420","0x0",524,96,7,1,0,"0x124894480","0x0",527,96,7,1,0,"0x1248944e0","0x0",530,96,7,1,0,"0x124894540","0x0",1763,96,7,1,0,"0x1248945a0","0x0",1767,96,7,1,0,"0x124894600","0x0",1754,96,7,1,0,"0x124894660","0x0",1749,96,7,1,0,"0x1248946c0","0x0",1742,96,7,1,0,"0x124894720","0x0",1753,96,7,1,0,"0x124894780","0x0",1741,96,7,1,0,"0x1248947e0","0x0",1736,96,7,1,0,"0x124894840","0x0",1717,96,7,1,0,"0x1248948a0","0x0",1722,96,7,1,0,"0x124894900","0x0",1715,96,7,1,0,"0x124894960","0x0",1708,96,7,1,0,"0x1248949c0","0x0",1697,96,7,1,0,"0x124894a20","0x0",1686,96,7,1,0,"0x124894a80","0x0",1696,96,7,1,0,"0x124894ae0","0x0",1687,96,7,1,0,"0x124894b40","0x0",1675,96,7,1,0,"0x124894ba0","0x0",1665,96,7,1,0,"0x124894c00","0x0",1667,96,7,1,0,"0x124894c60","0x0",1666,96,7,1,0,"0x124894cc0","0x0",1654,96,7,1,0,"0x124894d20","0x0",1647,96,7,1,0,"0x124894d80","0x0",1646,96,7,1,0,"0x124894de0","0x0",1638,96,7,1,0,"0x124894e40","0x0",1628,96,7,1,0,"0x124894ea0","0x0",1633,96,7,1,0,"0x124894f00","0x0",1615,96,7,1,0,"0x124894f60","0x0",1621,96,7,1,0,"0x124894fc0","0x0",1594,96,7,1,0,"0x124895020","0x0",1608,96,7,1,0,"0x124895080","0x0",1591,96,7,1,0,"0x1248950e0","0x0",1599,96,7,1,0,"0x124895140","0x0",1576,96,7,1,0,"0x1248951a0","0x0",1575,96,7,1,0,"0x124895260","0x0",1555,96,7,1,0,"0x1248952c0","0x0",1551,96,7,1,0,"0x124895320","0x0",1562,96,7,1,0,"0x124895380","0x0",1544,96,7,1,0,"0x1248953e0","0x0",1536,96,7,1,0,"0x124895440","0x0",1523,96,7,1,0,"0x1248954a0","0x0",1789,112,8,1,2,"0x124d6c070","0x0",1792,112,8,1,2,"0x124d6c1c0","0x0",1796,112,8,1,2,"0x124d6c230","0x0",1802,112,8,1,2,"0x124d6c380","0x0",1803,112,8,1,2,"0x124d6caf0","0x0",1808,112,8,1,2,"0x124d6e1b0","0x0",1812,112,8,1,3,"0x124d6f410","0x0",1053,112,8,1,4,"0x124d6f480","0x0",1067,112,8,1,4,"0x124d6f4f0","0x0",1046,112,8,1,4,"0x124d6f560","0x0",1033,112,8,1,4,"0x124d6f5d0","0x0",1077,112,8,1,2,"0x124d6f640","0x0",1022,112,8,1,2,"0x124d6f6b0","0x0",1029,112,8,1,5,"0x124d6fb10","0x0",1016,112,8,1,6,"0x124d6fb80","0x0",536,112,8,1,6,"0x124d6fc60","0x0",1060,112,8,1,2,"0x124d6fcd0","0x0",1157,112,8,1,2,"0x124d6fd40","0x0",2174,32,9,0,1,"0x124de2da0","0x127800a00",1,112,8,1,7,"0x125000000","0x0",2,112,8,1,8,"0x125000070","0x0",3,112,8,1,9,"0x1250000e0","0x0",4,112,8,1,10,"0x125000150","0x0",5,112,8,1,11,"0x1250001c0","0x0",6,112,8,1,12,"0x125000230","0x0",7,112,8,1,13,"0x1250002a0","0x0",8,112,8,1,14,"0x125000310","0x0",9,112,8,1,15,"0x125000380","0x0",10,112,8,1,16,"0x1250003f0","0x0",11,112,8,1,17,"0x125000460","0x0",12,112,8,1,18,"0x1250004d0","0x0",13,112,8,1,19,"0x125000540","0x0",14,112,8,1,20,"0x1250005b0","0x0",15,112,8,1,21,"0x125000620","0x0",16,112,8,1,22,"0x125000690","0x0",17,112,8,1,23,"0x125000700","0x0",18,112,8,1,24,"0x125000770","0x0",19,112,8,1,25,"0x1250007e0","0x0",20,112,8,1,26,"0x125000850","0x0",21,112,8,1,26,"0x1250008c0","0x0",22,112,8,1,26,"0x125000930","0x0",23,112,8,1,27,"0x1250009a0","0x0",24,112,8,1,28,"0x125000a10","0x0",25,112,8,1,29,"0x125000a80","0x0",26,112,8,1,30,"0x125000af0","0x0",27,112,8,1,31,"0x125000b60","0x0",28,112,8,1,32,"0x125000bd0","0x0",29,112,8,1,33,"0x125000c40","0x0",30,112,8,1,34,"0x125000cb0","0x0",31,112,8,1,35,"0x125000d20","0x0",32,112,8,1,36,"0x125000d90","0x0",33,112,8,1,37,"0x125000e00","0x0",34,112,8,1,38,"0x125000e70","0x0",35,112,8,1,39,"0x125000ee0","0x0",36,112,8,1,40,"0x125000f50","0x0",37,112,8,1,41,"0x125000fc0","0x0",38,112,8,1,42,"0x125001030","0x0",39,112,8,1,43,"0x1250010a0","0x0",40,112,8,1,44,"0x125001110","0x0",41,112,8,1,45,"0x125001180","0x0",42,112,8,1,46,"0x1250011f0","0x0",43,112,8,1,47,"0x125001260","0x0",44,112,8,1,48,"0x1250012d0","0x0",45,112,8,1,49,"0x125001340","0x0",46,112,8,1,50,"0x1250013b0","0x0",47,112,8,1,51,"0x125001420","0x0",48,112,8,1,51,"0x125001490","0x0",49,112,8,1,52,"0x125001500","0x0",50,112,8,1,53,"0x125001570","0x0",51,112,8,1,54,"0x1250015e0","0x0",52,112,8,1,55,"0x125001650","0x0",53,112,8,1,56,"0x1250016c0","0x0",55,32,10,1,0,"0x125008000","0x0",1499,32,11,1,0,"0x12500a540","0x0",425,32,11,1,0,"0x12500a560","0x0",423,32,11,1,0,"0x12500a580","0x0",378,32,11,1,0,"0x12500a5a0","0x0",348,32,11,1,0,"0x12500a5c0","0x0",1564,32,11,1,0,"0x12500a5e0","0x0",332,32,11,1,0,"0x12500a600","0x0",2309,32,11,1,0,"0x12500a620","0x0",2301,32,11,1,0,"0x12500a640","0x0",2300,32,11,1,0,"0x12500a660","0x0",2298,32,11,1,0,"0x12500a680","0x0",2296,32,11,1,0,"0x12500a6a0","0x0",2292,32,11,1,0,"0x12500a6c0","0x0",2290,32,11,1,0,"0x12500a6e0","0x0",2287,32,11,1,0,"0x12500a700","0x0",2281,32,11,1,0,"0x12500a720","0x0",2279,32,11,1,0,"0x12500a740","0x0",2275,32,11,1,0,"0x12500a760","0x0",2274,32,11,1,0,"0x12500a780","0x0",2273,32,11,1,0,"0x12500a7a0","0x0",2271,32,11,1,0,"0x12500a7c0","0x0",2270,32,11,1,0,"0x12500a7e0","0x0",2269,32,11,1,0,"0x12500a800","0x0",2268,32,11,1,0,"0x12500a820","0x0",2267,32,11,1,0,"0x12500a840","0x0",2266,32,11,1,0,"0x12500a860","0x0",2265,32,11,1,0,"0x12500a880","0x0",2264,32,11,1,0,"0x12500a8a0","0x0",2263,32,11,1,0,"0x12500a8c0","0x0",2262,32,11,1,0,"0x12500a8e0","0x0",2272,32,11,1,0,"0x12500a900","0x0",2277,32,11,1,0,"0x12500a920","0x0",2276,32,11,1,0,"0x12500a940","0x0",2278,32,11,1,0,"0x12500a960","0x0",2284,32,11,1,0,"0x12500a980","0x0",2280,32,11,1,0,"0x12500a9a0","0x0",2283,32,11,1,0,"0x12500a9c0","0x0",2282,32,11,1,0,"0x12500a9e0","0x0",2288,32,11,1,0,"0x12500aa00","0x0",2285,32,11,1,0,"0x12500aa20","0x0",2293,32,11,1,0,"0x12500aa40","0x0",2291,32,11,1,0,"0x12500aa60","0x0",2286,32,11,1,0,"0x12500aa80","0x0",2289,32,11,1,0,"0x12500aaa0","0x0",54,48,10,1,0,"0x125010000","0x0",328,32,12,0,0,"0x125018000","0x0",327,33,12,0,0,"0x125018020","0x0",326,33,12,0,0,"0x125018040","0x0",325,33,12,0,0,"0x125018060","0x0",324,33,12,0,0,"0x125018080","0x0",323,33,12,0,0,"0x1250180a0","0x0",322,33,12,0,0,"0x1250180c0","0x0",321,33,12,0,0,"0x1250180e0","0x0",320,33,12,0,0,"0x125018100","0x0",319,33,12,0,0,"0x125018120","0x0",318,33,12,0,0,"0x125018140","0x0",317,33,12,0,0,"0x125018160","0x0",316,33,12,0,0,"0x125018180","0x0",315,33,12,0,0,"0x1250181a0","0x0",314,33,12,0,0,"0x1250181c0","0x0",313,33,12,0,0,"0x1250181e0","0x0",312,33,12,0,0,"0x125018200","0x0",311,33,12,0,0,"0x125018220","0x0",310,33,12,0,0,"0x125018240","0x0",309,33,12,0,0,"0x125018260","0x0",308,33,12,0,0,"0x125018280","0x0",307,33,12,0,0,"0x1250182a0","0x0",306,33,12,0,0,"0x1250182c0","0x0",305,33,12,0,0,"0x1250182e0","0x0",304,33,12,0,0,"0x125018300","0x0",303,33,12,0,0,"0x125018320","0x0",302,33,12,0,0,"0x125018340","0x0",301,33,12,0,0,"0x125018360","0x0",300,33,12,0,0,"0x125018380","0x0",299,33,12,0,0,"0x1250183a0","0x0",298,33,12,0,0,"0x1250183c0","0x0",297,33,12,0,0,"0x1250183e0","0x0",296,33,12,0,0,"0x125018400","0x0",295,33,12,0,0,"0x125018420","0x0",294,33,12,0,0,"0x125018440","0x0",293,33,12,0,0,"0x125018460","0x0",292,33,12,0,0,"0x125018480","0x0",291,33,12,0,0,"0x1250184a0","0x0",290,33,12,0,0,"0x1250184c0","0x0",289,33,12,0,0,"0x1250184e0","0x0",288,33,12,0,0,"0x125018500","0x0",285,33,12,0,0,"0x125018520","0x0",283,33,12,0,0,"0x125018540","0x0",281,33,12,0,0,"0x125018560","0x0",278,33,12,0,0,"0x125018580","0x0",274,33,12,0,0,"0x1250185a0","0x0",269,33,12,0,0,"0x1250185c0","0x0",266,33,12,0,0,"0x1250185e0","0x0",263,33,12,0,0,"0x125018600","0x0",259,33,12,0,0,"0x125018620","0x0",256,33,12,0,0,"0x125018640","0x0",251,33,12,0,0,"0x125018660","0x0",248,33,12,0,0,"0x125018680","0x0",244,33,12,0,0,"0x1250186a0","0x0",242,33,12,0,0,"0x1250186c0","0x0",239,33,12,0,0,"0x1250186e0","0x0",236,33,12,0,0,"0x125018700","0x0",234,33,12,0,0,"0x125018720","0x0",231,33,12,0,0,"0x125018740","0x0",228,33,12,0,0,"0x125018760","0x0",223,33,12,0,0,"0x125018780","0x0",220,33,12,0,0,"0x1250187a0","0x0",215,33,12,0,0,"0x1250187c0","0x0",213,33,12,0,0,"0x1250187e0","0x0",211,33,12,0,0,"0x125018800","0x0",208,33,12,0,0,"0x125018820","0x0",205,33,12,0,0,"0x125018840","0x0",202,33,12,0,0,"0x125018860","0x0",199,33,12,0,0,"0x125018880","0x0",197,33,12,0,0,"0x1250188a0","0x0",195,33,12,0,0,"0x1250188c0","0x0",191,33,12,0,0,"0x1250188e0","0x0",186,33,12,0,0,"0x125018900","0x0",184,33,12,0,0,"0x125018920","0x0",181,33,12,0,0,"0x125018940","0x0",176,33,12,0,0,"0x125018960","0x0",172,33,12,0,0,"0x125018980","0x0",169,33,12,0,0,"0x1250189a0","0x0",165,33,12,0,0,"0x1250189c0","0x0",163,33,12,0,0,"0x1250189e0","0x0",162,33,12,0,0,"0x125018a00","0x0",161,33,12,0,0,"0x125018a20","0x0",160,33,12,0,0,"0x125018a40","0x0",159,33,12,0,0,"0x125018a60","0x0",158,33,12,0,0,"0x125018a80","0x0",157,33,12,0,0,"0x125018aa0","0x0",164,33,12,0,0,"0x125018ac0","0x0",166,33,12,0,0,"0x125018ae0","0x0",168,33,12,0,0,"0x125018b00","0x0",171,33,12,0,0,"0x125018b20","0x0",173,33,12,0,0,"0x125018b40","0x0",167,33,12,0,0,"0x125018b60","0x0",170,33,12,0,0,"0x125018b80","0x0",179,33,12,0,0,"0x125018ba0","0x0",175,33,12,0,0,"0x125018bc0","0x0",174,33,12,0,0,"0x125018be0","0x0",177,33,12,0,0,"0x125018c00","0x0",178,33,12,0,0,"0x125018c20","0x0",180,33,12,0,0,"0x125018c40","0x0",183,33,12,0,0,"0x125018c60","0x0",182,33,12,0,0,"0x125018c80","0x0",185,33,12,0,0,"0x125018ca0","0x0",188,33,12,0,0,"0x125018cc0","0x0",187,33,12,0,0,"0x125018ce0","0x0",189,33,12,0,0,"0x125018d00","0x0",190,33,12,0,0,"0x125018d20","0x0",192,33,12,0,0,"0x125018d40","0x0",200,33,12,0,0,"0x125018d60","0x0",201,33,12,0,0,"0x125018d80","0x0",206,33,12,0,0,"0x125018da0","0x0",196,33,12,0,0,"0x125018dc0","0x0",198,33,12,0,0,"0x125018de0","0x0",193,33,12,0,0,"0x125018e00","0x0",194,33,12,0,0,"0x125018e20","0x0",203,33,12,0,0,"0x125018e40","0x0",204,33,12,0,0,"0x125018e60","0x0",207,33,12,0,0,"0x125018e80","0x0",209,33,12,0,0,"0x125018ea0","0x0",210,33,12,0,0,"0x125018ec0","0x0",212,33,12,0,0,"0x125018ee0","0x0",214,33,12,0,0,"0x125018f00","0x0",217,33,12,0,0,"0x125018f20","0x0",216,33,12,0,0,"0x125018f40","0x0",221,33,12,0,0,"0x125018f60","0x0",218,33,12,0,0,"0x125018f80","0x0",219,33,12,0,0,"0x125018fa0","0x0",222,33,12,0,0,"0x125018fc0","0x0",224,33,12,0,0,"0x125018fe0","0x0",225,33,12,0,0,"0x125019000","0x0",226,33,12,0,0,"0x125019020","0x0",227,33,12,0,0,"0x125019040","0x0",229,33,12,0,0,"0x125019060","0x0",230,33,12,0,0,"0x125019080","0x0",232,33,12,0,0,"0x1250190a0","0x0",233,33,12,0,0,"0x1250190c0","0x0",235,33,12,0,0,"0x1250190e0","0x0",237,33,12,0,0,"0x125019100","0x0",238,33,12,0,0,"0x125019120","0x0",240,33,12,0,0,"0x125019140","0x0",241,33,12,0,0,"0x125019160","0x0",243,33,12,0,0,"0x125019180","0x0",245,33,12,0,0,"0x1250191a0","0x0",246,33,12,0,0,"0x1250191c0","0x0",247,33,12,0,0,"0x1250191e0","0x0",249,33,12,0,0,"0x125019200","0x0",250,33,12,0,0,"0x125019220","0x0",253,33,12,0,0,"0x125019240","0x0",252,33,12,0,0,"0x125019260","0x0",254,33,12,0,0,"0x125019280","0x0",255,33,12,0,0,"0x1250192a0","0x0",257,33,12,0,0,"0x1250192c0","0x0",258,33,12,0,0,"0x1250192e0","0x0",260,33,12,0,0,"0x125019300","0x0",261,33,12,0,0,"0x125019320","0x0",262,33,12,0,0,"0x125019340","0x0",264,33,12,0,0,"0x125019360","0x0",265,33,12,0,0,"0x125019380","0x0",267,33,12,0,0,"0x1250193a0","0x0",273,33,12,0,0,"0x1250193c0","0x0",268,33,12,0,0,"0x1250193e0","0x0",275,33,12,0,0,"0x125019400","0x0",271,33,12,0,0,"0x125019420","0x0",270,33,12,0,0,"0x125019440","0x0",272,33,12,0,0,"0x125019460","0x0",276,33,12,0,0,"0x125019480","0x0",277,33,12,0,0,"0x1250194a0","0x0",279,33,12,0,0,"0x1250194c0","0x0",280,33,12,0,0,"0x1250194e0","0x0",282,33,12,0,0,"0x125019500","0x0",284,33,12,0,0,"0x125019520","0x0",286,33,12,0,0,"0x125019540","0x0",287,33,12,0,0,"0x125019560","0x0",156,33,12,0,0,"0x125019580","0x0",155,33,12,0,0,"0x1250195a0","0x0",154,33,12,0,0,"0x1250195c0","0x0",153,33,12,0,0,"0x1250195e0","0x0",152,33,12,0,0,"0x125019600","0x0",151,33,12,0,0,"0x125019620","0x0",150,33,12,0,0,"0x125019640","0x0",149,33,12,0,0,"0x125019660","0x0",148,33,12,0,0,"0x125019680","0x0",147,33,12,0,0,"0x1250196a0","0x0",146,33,12,0,0,"0x1250196c0","0x0",145,33,12,0,0,"0x1250196e0","0x0",144,33,12,0,0,"0x125019700","0x0",143,33,12,0,0,"0x125019720","0x0",142,33,12,0,0,"0x125019740","0x0",141,33,12,0,0,"0x125019760","0x0",140,33,12,0,0,"0x125019780","0x0",139,33,12,0,0,"0x1250197a0","0x0",138,33,12,0,0,"0x1250197c0","0x0",137,33,12,0,0,"0x1250197e0","0x0",136,33,12,0,0,"0x125019800","0x0",135,33,12,0,0,"0x125019820","0x0",134,33,12,0,0,"0x125019840","0x0",133,33,12,0,0,"0x125019860","0x0",132,33,12,0,0,"0x125019880","0x0",131,33,12,0,0,"0x1250198a0","0x0",130,33,12,0,0,"0x1250198c0","0x0",129,33,12,0,0,"0x1250198e0","0x0",128,33,12,0,0,"0x125019900","0x0",127,33,12,0,0,"0x125019920","0x0",126,33,12,0,0,"0x125019940","0x0",125,33,12,0,0,"0x125019960","0x0",124,33,12,0,0,"0x125019980","0x0",123,33,12,0,0,"0x1250199a0","0x0",122,33,12,0,0,"0x1250199c0","0x0",121,33,12,0,0,"0x1250199e0","0x0",120,33,12,0,0,"0x125019a00","0x0",119,33,12,0,0,"0x125019a20","0x0",118,33,12,0,0,"0x125019a40","0x0",117,33,12,0,0,"0x125019a60","0x0",116,33,12,0,0,"0x125019a80","0x0",115,33,12,0,0,"0x125019aa0","0x0",114,33,12,0,0,"0x125019ac0","0x0",113,33,12,0,0,"0x125019ae0","0x0",112,33,12,0,0,"0x125019b00","0x0",111,33,12,0,0,"0x125019b20","0x0",110,33,12,0,0,"0x125019b40","0x0",109,33,12,0,0,"0x125019b60","0x0",108,33,12,0,0,"0x125019b80","0x0",107,33,12,0,0,"0x125019ba0","0x0",106,33,12,0,0,"0x125019bc0","0x0",105,33,12,0,0,"0x125019be0","0x0",104,33,12,0,0,"0x125019c00","0x0",103,33,12,0,0,"0x125019c20","0x0",102,33,12,0,0,"0x125019c40","0x0",101,33,12,0,0,"0x125019c60","0x0",100,33,12,0,0,"0x125019c80","0x0",99,33,12,0,0,"0x125019ca0","0x0",98,33,12,0,0,"0x125019cc0","0x0",97,33,12,0,0,"0x125019ce0","0x0",96,33,12,0,0,"0x125019d00","0x0",95,33,12,0,0,"0x125019d20","0x0",94,33,12,0,0,"0x125019d40","0x0",93,33,12,0,0,"0x125019d60","0x0",92,33,12,0,0,"0x125019d80","0x0",91,33,12,0,0,"0x125019da0","0x0",90,33,12,0,0,"0x125019dc0","0x0",89,33,12,0,0,"0x125019de0","0x0",88,33,12,0,0,"0x125019e00","0x0",87,33,12,0,0,"0x125019e20","0x0",86,33,12,0,0,"0x125019e40","0x0",85,33,12,0,0,"0x125019e60","0x0",84,33,12,0,0,"0x125019e80","0x0",83,33,12,0,0,"0x125019ea0","0x0",82,33,12,0,0,"0x125019ec0","0x0",81,33,12,0,0,"0x125019ee0","0x0",80,33,12,0,0,"0x125019f00","0x0",79,33,12,0,0,"0x125019f20","0x0",78,33,12,0,0,"0x125019f40","0x0",77,33,12,0,0,"0x125019f60","0x0",76,33,12,0,0,"0x125019f80","0x0",75,33,12,0,0,"0x125019fa0","0x0",74,33,12,0,0,"0x125019fc0","0x0",73,33,12,0,0,"0x125019fe0","0x0",72,33,12,0,0,"0x12501a000","0x0",71,35,12,0,0,"0x12501a020","0x0",70,39,12,0,0,"0x12501a040","0x0",69,35,12,0,0,"0x12501a060","0x0",68,36,12,0,0,"0x12501a080","0x0",67,34,12,0,0,"0x12501a0a0","0x0",66,33,12,0,0,"0x12501a0c0","0x0",65,34,12,0,0,"0x12501a0e0","0x0",64,34,12,0,0,"0x12501a100","0x0",63,38,12,0,0,"0x12501a120","0x0",62,33,12,0,0,"0x12501a140","0x0",61,38,12,0,0,"0x12501a160","0x0",60,34,12,0,0,"0x12501a180","0x0",59,40,12,0,0,"0x12501a1a0","0x0",58,45,12,0,0,"0x12501a1c0","0x0",57,50,12,0,0,"0x12501a1e0","0x0",2216,148,6,0,0,"0x125047cc0","0x0",1495,17,13,0,0,"0x125171e80","0x0",347,215,14,0,0,"0x125171e90","0x0",1554,64,15,0,0,"0x125171ea0","0x0",331,20,16,0,0,"0x125171eb0","0x0",1467,17,17,0,0,"0x125171ec0","0x0",1458,17,18,0,0,"0x125171ed0","0x0",1445,17,19,0,0,"0x125171ee0","0x0",1434,17,20,0,0,"0x125171ef0","0x0",1395,17,21,0,0,"0x125171f00","0x0",1379,17,22,0,0,"0x125171f10","0x0",1365,17,23,0,0,"0x125171f30","0x0",2294,23,24,0,0,"0x125171f50","0x0",1280,16,24,0,0,"0x125171f60","0x0",863,17,25,0,0,"0x125171f70","0x0",722,18,26,0,0,"0x125171fe0","0x0",729,18,27,0,0,"0x125171ff0","0x0",889,19,28,0,0,"0x125172000","0x0",773,18,29,0,0,"0x125172020","0x0",931,17,30,0,0,"0x125172040","0x0",2295,18,31,0,0,"0x125172060","0x0",1204,18,31,0,0,"0x125172070","0x0",1047,19,31,0,0,"0x125172080","0x0",1122,19,31,0,0,"0x125172090","0x0",953,18,31,0,0,"0x1251720c0","0x0",2297,21,31,0,0,"0x1251720d0","0x0",1023,20,32,0,0,"0x1251721b0","0x0",989,19,33,0,0,"0x1251721d0","0x0",970,20,34,0,0,"0x1251721e0","0x0",2235,19,31,0,0,"0x1251721f0","0x0",2224,19,31,0,0,"0x125172200","0x0",1265,18,35,0,0,"0x125172210","0x0",1226,18,36,0,0,"0x125172220","0x0",1210,19,37,0,0,"0x125172240","0x0",1205,28,38,0,0,"0x125172250","0x0",1200,28,39,0,0,"0x125172260","0x0",952,19,31,0,0,"0x125172280","0x0",1135,19,40,0,0,"0x125172290","0x0",999,18,32,0,0,"0x1251722a0","0x0",981,18,41,0,0,"0x1251722c0","0x0",1012,17,42,0,0,"0x1251722d0","0x0",957,17,43,0,0,"0x1251722e0","0x0",950,28,31,0,0,"0x1251722f0","0x0",2372,16,44,0,0,"0x125172310","0x0",1360,33,12,0,0,"0x1251e8000","0x0",1320,33,12,0,0,"0x1251e8040","0x0",1305,33,12,0,0,"0x1251e80e0","0x0",1285,33,12,0,0,"0x1251e8120","0x0",1260,33,12,0,0,"0x1251e8140","0x0",1242,33,12,0,0,"0x1251e8200","0x0",1217,33,12,0,0,"0x1251e8220","0x0",954,37,12,0,0,"0x1251e8240","0x0",932,33,12,0,0,"0x1251e8260","0x0",1166,52,12,0,0,"0x1251e8280","0x0",1139,38,12,0,0,"0x1251e82a0","0x0",1710,49,12,0,0,"0x1251e82c0","0x0",1679,39,12,0,0,"0x1251e8300","0x0",1648,41,12,0,0,"0x1251e8320","0x0",1632,33,12,0,0,"0x1251e8360","0x0",1607,34,12,0,0,"0x1251e8380","0x0",1590,33,12,0,0,"0x1251e8400","0x0",1563,34,12,0,0,"0x1251e8440","0x0",1534,35,12,0,0,"0x1251e8460","0x0",1519,33,12,0,0,"0x1251e8480","0x0",1506,37,12,0,0,"0x1251e84a0","0x0",1479,37,12,0,0,"0x1251e84c0","0x0",1428,35,12,0,0,"0x1251e84e0","0x0",1410,35,12,0,0,"0x1251e8500","0x0",1390,35,12,0,0,"0x1251e8520","0x0",1366,34,12,0,0,"0x1251e8540","0x0",1346,33,12,0,0,"0x1251e8560","0x0",1333,33,12,0,0,"0x1251e8580","0x0",1313,33,12,0,0,"0x1251e85c0","0x0",1296,34,12,0,0,"0x1251e85e0","0x0",1279,33,12,0,0,"0x1251e8600","0x0",1264,35,12,0,0,"0x1251e8620","0x0",1245,34,12,0,0,"0x1251e8640","0x0",1225,34,12,0,0,"0x1251e8660","0x0",1193,33,12,0,0,"0x1251e8680","0x0",1177,33,12,0,0,"0x1251e86a0","0x0",1004,46,12,0,0,"0x1251e86c0","0x0",986,41,12,0,0,"0x1251e86e0","0x0",1180,46,12,0,0,"0x1251e8700","0x0",1156,43,12,0,0,"0x1251e8720","0x0",1148,33,12,0,0,"0x1251e8740","0x0",2211,34,12,0,0,"0x1251e8760","0x0",2205,34,12,0,0,"0x1251e8780","0x0",1328,41,12,0,0,"0x1251e87a0","0x0",1444,42,12,0,0,"0x1251e87c0","0x0",1498,43,12,0,0,"0x1251e87e0","0x0",1468,42,12,0,0,"0x1251e8800","0x0",1414,45,12,0,0,"0x1251e8820","0x0",1384,46,12,0,0,"0x1251e8840","0x0",1235,42,12,0,0,"0x1251e8860","0x0",1357,42,12,0,0,"0x1251e8880","0x0",1206,33,12,0,0,"0x1251e88a0","0x0",1513,33,12,0,0,"0x1251e88c0","0x0",1167,34,12,0,0,"0x1251e88e0","0x0",1419,34,12,0,0,"0x1251e8900","0x0",1398,33,12,0,0,"0x1251e8920","0x0",1318,34,12,0,0,"0x1251e8940","0x0",1303,34,12,0,0,"0x1251e8960","0x0",1237,33,12,0,0,"0x1251e8980","0x0",1211,33,12,0,0,"0x1251e89a0","0x0",1190,33,12,0,0,"0x1251e89c0","0x0",1164,34,12,0,0,"0x1251e89e0","0x0",1143,33,12,0,0,"0x1251e8a00","0x0",1127,33,12,0,0,"0x1251e8a20","0x0",1112,33,12,0,0,"0x1251e8a40","0x0",1086,33,12,0,0,"0x1251e8a60","0x0",1002,33,12,0,0,"0x1251e8aa0","0x0",923,33,12,0,0,"0x1251e8ac0","0x0",1129,45,12,0,0,"0x1251e8ae0","0x0",1150,45,12,0,0,"0x1251e8bc0","0x0",1100,36,12,0,0,"0x1251e8d20","0x0",1088,36,12,0,0,"0x1251e8d40","0x0",1075,36,12,0,0,"0x1251e8da0","0x0",1061,36,12,0,0,"0x1251e8dc0","0x0",1040,35,12,0,0,"0x1251e8e20","0x0",1030,35,12,0,0,"0x1251e8e40","0x0",1007,35,12,0,0,"0x1251e8ea0","0x0",933,33,12,0,0,"0x1251e8ec0","0x0",990,33,12,0,0,"0x1251e8f20","0x0",964,33,12,0,0,"0x1251e8f40","0x0",975,33,12,0,0,"0x1251e8fa0","0x0",2396,35,12,0,0,"0x1251e9dc0","0x0",1292,176,45,1,0,"0x125208c60","0x0",1611,176,45,1,0,"0x125208fd0","0x0",1262,176,45,1,0,"0x125209a20","0x0",1691,176,45,1,0,"0x125209b80","0x0",1660,176,45,1,0,"0x125209ef0","0x0",1622,176,45,1,0,"0x125209fa0","0x0",1582,176,45,1,0,"0x12520a100","0x0",1772,176,45,1,0,"0x12520a1b0","0x0",1719,176,45,1,0,"0x12520a260","0x0",1546,176,45,1,0,"0x12520a310","0x0",1524,176,45,1,0,"0x12520a3c0","0x0",1500,176,45,1,0,"0x12520a470","0x0",1486,176,45,1,0,"0x12520a680","0x0",1451,176,45,1,0,"0x12520a730","0x0",1433,176,45,1,0,"0x12520a7e0","0x0",1367,176,45,1,0,"0x12520a9f0","0x0",1750,176,45,1,0,"0x12520ab50","0x0",1343,176,45,1,0,"0x12520ac00","0x0",1274,176,45,1,0,"0x12520acb0","0x0",1049,176,45,1,0,"0x12520ad60","0x0",1013,176,45,1,0,"0x12520aec0","0x0",915,176,45,1,0,"0x12520b020","0x0",1537,176,45,1,0,"0x12520b230","0x0",940,176,45,1,0,"0x12520b2e0","0x0",935,176,45,1,0,"0x12520b4f0","0x0",995,176,45,1,0,"0x12520b5a0","0x0",892,176,45,1,0,"0x12520b650","0x0",902,176,45,1,0,"0x12520b700","0x0",1651,37,12,0,0,"0x125210080","0x0",1650,34,12,0,0,"0x125210180","0x0",1657,36,12,0,0,"0x1252104c0","0x0",1669,36,12,0,0,"0x125210800","0x0",1676,35,12,0,0,"0x125210820","0x0",1670,37,12,0,0,"0x125210840","0x0",1678,38,12,0,0,"0x1252111e0","0x0",1690,37,12,0,0,"0x125211200","0x0",1699,37,12,0,0,"0x125211220","0x0",1688,37,12,0,0,"0x125211240","0x0",1701,35,12,0,0,"0x125211260","0x0",1712,34,12,0,0,"0x125211280","0x0",1718,34,12,0,0,"0x1252118c0","0x0",1725,33,12,0,0,"0x1252118e0","0x0",1727,33,12,0,0,"0x125211900","0x0",1739,33,12,0,0,"0x125211980","0x0",1744,37,12,0,0,"0x125211a00","0x0",1758,36,12,0,0,"0x125211a20","0x0",1746,37,12,0,0,"0x125211a40","0x0",1760,35,12,0,0,"0x125211a60","0x0",1759,35,12,0,0,"0x125211a80","0x0",1769,37,12,0,0,"0x125211aa0","0x0",1766,36,12,0,0,"0x125211ac0","0x0",531,35,12,0,0,"0x125211ae0","0x0",528,35,12,0,0,"0x125211b00","0x0",525,39,12,0,0,"0x125211b20","0x0",522,36,12,0,0,"0x125211d80","0x0",519,37,12,0,0,"0x125211fe0","0x0",516,36,12,0,0,"0x125212ec0","0x0",513,38,12,0,0,"0x125212ee0","0x0",510,36,12,0,0,"0x125212f00","0x0",507,35,12,0,0,"0x125212f20","0x0",504,37,12,0,0,"0x125212f40","0x0",501,38,12,0,0,"0x125212fe0","0x0",498,37,12,0,0,"0x125213000","0x0",1829,35,12,0,0,"0x125213020","0x0",1823,35,12,0,0,"0x125213040","0x0",1817,35,12,0,0,"0x125213060","0x0",1809,35,12,0,0,"0x125213080","0x0",1801,37,12,0,0,"0x1252130a0","0x0",1793,37,12,0,0,"0x1252130c0","0x0",1785,35,12,0,0,"0x1252130e0","0x0",1777,34,12,0,0,"0x125213100","0x0",1762,38,12,0,0,"0x125213120","0x0",1732,35,12,0,0,"0x125213140","0x0",1716,35,12,0,0,"0x125213160","0x0",1695,35,12,0,0,"0x125213180","0x0",1677,34,12,0,0,"0x1252131a0","0x0",1644,36,12,0,0,"0x125213240","0x0",1623,35,12,0,0,"0x125213280","0x0",343,36,12,0,0,"0x1252132a0","0x0",340,37,12,0,0,"0x125213300","0x0",335,36,12,0,0,"0x125213320","0x0",2351,35,12,0,0,"0x125213340","0x0",2335,33,12,0,0,"0x125213360","0x0",1484,37,12,0,0,"0x125213380","0x0",1471,44,12,0,0,"0x1252133a0","0x0",1465,38,12,0,0,"0x1252133c0","0x0",1447,38,12,0,0,"0x1252133e0","0x0",1406,41,12,0,0,"0x125213400","0x0",1396,40,12,0,0,"0x125213440","0x0",1383,44,12,0,0,"0x125213480","0x0",755,44,12,0,0,"0x1252134a0","0x0",770,44,12,0,0,"0x1252134c0","0x0",778,46,12,0,0,"0x1252134e0","0x0",2324,33,12,0,0,"0x125213500","0x0",2313,33,12,0,0,"0x125213520","0x0",2319,37,12,0,0,"0x125213540","0x0",1197,43,12,0,0,"0x125213560","0x0",1208,38,12,0,0,"0x125213580","0x0",1039,46,12,0,0,"0x1252135a0","0x0",1069,38,12,0,0,"0x1252135c0","0x0",1064,34,12,0,0,"0x1252135e0","0x0",1116,44,12,0,0,"0x125213600","0x0",1144,38,12,0,0,"0x125213640","0x0",1141,34,12,0,0,"0x125213660","0x0",947,40,12,0,0,"0x125213680","0x0",956,38,12,0,0,"0x1252136a0","0x0",2307,33,12,0,0,"0x1252136c0","0x0",1034,54,12,0,0,"0x1252136e0","0x0",1026,54,12,0,0,"0x125213700","0x0",1011,45,12,0,0,"0x125213720","0x0",992,45,12,0,0,"0x125213740","0x0",983,49,12,0,0,"0x125213760","0x0",972,49,12,0,0,"0x125213780","0x0",2236,37,12,0,0,"0x1252137a0","0x0",2234,37,12,0,0,"0x1252137e0","0x0",2225,37,12,0,0,"0x125213860","0x0",2223,37,12,0,0,"0x1252138a0","0x0",719,39,12,0,0,"0x1252138c0","0x0",2316,39,12,0,0,"0x125213900","0x0",2308,35,12,0,0,"0x1252139a0","0x0",2311,35,12,0,0,"0x1252139c0","0x0",2317,37,12,0,0,"0x1252139e0","0x0",2320,39,12,0,0,"0x125213a00","0x0",2371,35,12,0,0,"0x125213a20","0x0",2347,38,12,0,0,"0x125213a40","0x0",2359,38,12,0,0,"0x125213a60","0x0",2352,38,12,0,0,"0x125213a80","0x0",2360,33,12,0,0,"0x125213aa0","0x0",2261,33,12,0,0,"0x125213ac0","0x0",2258,43,12,0,0,"0x125213ae0","0x0",2217,38,12,0,0,"0x125213b00","0x0",2254,37,12,0,0,"0x125213b20","0x0",2213,40,12,0,0,"0x125213b40","0x0",2250,33,12,0,0,"0x125213b60","0x0",2247,33,12,0,0,"0x125213b80","0x0",2244,33,12,0,0,"0x125213ba0","0x0",2241,33,12,0,0,"0x125213bc0","0x0",2238,38,12,0,0,"0x125213be0","0x0",1267,47,12,0,0,"0x125213c40","0x0",1230,39,12,0,0,"0x125213ca0","0x0",1214,39,12,0,0,"0x125213cc0","0x0",1400,40,12,0,0,"0x125213d60","0x0",1358,35,12,0,0,"0x125213d80","0x0",1329,33,12,0,0,"0x125213da0","0x0",1304,33,12,0,0,"0x125213dc0","0x0",1289,33,12,0,0,"0x125213de0","0x0",1269,33,12,0,0,"0x125213e00","0x0",1248,33,12,0,0,"0x125213e20","0x0",1220,33,12,0,0,"0x125213e40","0x0",1441,40,12,0,0,"0x125213e60","0x0",1397,35,12,0,0,"0x125213ea0","0x0",1529,36,12,0,0,"0x12524b120","0x0",1539,36,12,0,0,"0x12524b140","0x0",1550,34,12,0,0,"0x12524b160","0x0",1567,34,12,0,0,"0x12524b300","0x0",1556,35,12,0,0,"0x12524b860","0x0",1558,37,12,0,0,"0x12524b880","0x0",1579,36,12,0,0,"0x12524b8a0","0x0",1580,36,12,0,0,"0x12524b920","0x0",1602,36,12,0,0,"0x12524b980","0x0",1598,33,12,0,0,"0x12524b9a0","0x0",1620,37,12,0,0,"0x12524b9c0","0x0",1600,36,12,0,0,"0x12524b9e0","0x0",1624,37,12,0,0,"0x12524ba40","0x0",1617,37,12,0,0,"0x12524ba60","0x0",1636,36,12,0,0,"0x12524ba80","0x0",1630,36,12,0,0,"0x12524baa0","0x0",1645,38,12,0,0,"0x12524bae0","0x0",831,32,46,1,0,"0x125380040","0x0",717,32,46,1,0,"0x125380080","0x0",725,32,46,1,0,"0x1253800c0","0x0",736,32,46,1,0,"0x1253803c0","0x0",757,32,46,1,0,"0x125380520","0x0",762,32,46,1,0,"0x125380540","0x0",767,32,46,1,0,"0x125380580","0x0",765,32,46,1,0,"0x125380700","0x0",774,32,46,1,0,"0x125380720","0x0",789,32,46,1,0,"0x1253807a0","0x0",804,32,46,1,0,"0x1253807c0","0x0",794,32,46,1,0,"0x125380880","0x0",801,32,46,1,0,"0x1253808a0","0x0",853,32,46,1,0,"0x1253808c0","0x0",813,32,46,1,0,"0x1253808e0","0x0",834,32,46,1,0,"0x125380900","0x0",826,32,46,1,0,"0x125380920","0x0",837,32,46,1,0,"0x125380940","0x0",845,32,46,1,0,"0x125380a20","0x0",859,32,46,1,0,"0x125380ba0","0x0",864,32,46,1,0,"0x125380bc0","0x0",858,32,46,1,0,"0x125380be0","0x0",868,32,46,1,0,"0x125380c00","0x0",878,32,46,1,0,"0x125380c60","0x0",876,32,46,1,0,"0x125380c80","0x0",2364,32,46,1,0,"0x125380ce0","0x0",2342,32,46,1,0,"0x125380d00","0x0",779,32,46,1,0,"0x125380f40","0x0",1233,32,46,1,0,"0x125380f60","0x0",1344,32,46,1,0,"0x125380f80","0x0",1389,32,46,1,0,"0x125380fc0","0x0",1155,32,46,1,0,"0x125380fe0","0x0",1456,32,46,1,0,"0x125381000","0x0",1048,32,46,1,0,"0x125381080","0x0",974,32,46,1,0,"0x125381100","0x0",1355,32,46,1,0,"0x1253815e0","0x0",1327,32,46,1,0,"0x125381600","0x0",1294,32,46,1,0,"0x125381760","0x0",1613,32,46,1,0,"0x1253818a0","0x0",1263,32,46,1,0,"0x1253818c0","0x0",1693,32,46,1,0,"0x125381a00","0x0",1662,32,46,1,0,"0x125381a40","0x0",1625,32,46,1,0,"0x125381a60","0x0",1584,32,46,1,0,"0x125381a80","0x0",1773,32,46,1,0,"0x125381b40","0x0",1721,32,46,1,0,"0x125381b80","0x0",1548,32,46,1,0,"0x125381ca0","0x0",1526,32,46,1,0,"0x125381d60","0x0",1503,32,46,1,0,"0x125381da0","0x0",1487,32,46,1,0,"0x1253820c0","0x0",1452,32,46,1,0,"0x125382380","0x0",1436,32,46,1,0,"0x1253823a0","0x0",1368,32,46,1,0,"0x125382400","0x0",1752,32,46,1,0,"0x125382420","0x0",1345,32,46,1,0,"0x125382480","0x0",1276,32,46,1,0,"0x125382620","0x0",1057,32,46,1,0,"0x1253826e0","0x0",1014,32,46,1,0,"0x125382ac0","0x0",916,32,46,1,0,"0x125382ae0","0x0",1538,32,46,1,0,"0x125382b00","0x0",943,32,46,1,0,"0x125382b20","0x0",937,32,46,1,0,"0x125382ba0","0x0",997,32,46,1,0,"0x125382ca0","0x0",894,32,46,1,0,"0x125383280","0x0",904,32,46,1,0,"0x1253832c0","0x0",886,32,46,1,0,"0x1253832e0","0x0",2186,32,46,1,0,"0x125383300","0x0",760,176,45,1,0,"0x1253ed8c0","0x0",764,176,45,1,0,"0x1253edc30","0x0",763,176,45,1,0,"0x1253edce0","0x0",772,176,45,1,0,"0x1253edd90","0x0",788,176,45,1,0,"0x1253ede40","0x0",803,176,45,1,0,"0x1253edef0","0x0",792,176,45,1,0,"0x1253edfa0","0x0",800,176,45,1,0,"0x1253ee050","0x0",848,176,45,1,0,"0x1253ee100","0x0",811,176,45,1,0,"0x1253ee1b0","0x0",832,176,45,1,0,"0x1253ee260","0x0",822,176,45,1,0,"0x1253ee310","0x0",835,176,45,1,0,"0x1253ee3c0","0x0",843,176,45,1,0,"0x1253ee470","0x0",857,176,45,1,0,"0x1253ee940","0x0",860,176,45,1,0,"0x1253eeaa0","0x0",856,176,45,1,0,"0x1253eeb50","0x0",865,176,45,1,0,"0x1253ef910","0x0",877,176,45,1,0,"0x1253ef9c0","0x0",873,80,47,0,0,"0x126043de0","0x0",971,96,7,1,0,"0x126050000","0x0",960,96,7,1,0,"0x126050060","0x0",987,96,7,1,0,"0x1260500c0","0x0",929,96,7,1,0,"0x126050120","0x0",1003,96,7,1,0,"0x126050180","0x0",1027,96,7,1,0,"0x1260501e0","0x0",1037,96,7,1,0,"0x126050240","0x0",1054,96,7,1,0,"0x1260502a0","0x0",1073,96,7,1,0,"0x126050300","0x0",1084,96,7,1,0,"0x126050360","0x0",1098,96,7,1,0,"0x1260503c0","0x0",1145,96,7,1,0,"0x126050420","0x0",1126,96,7,1,0,"0x126050480","0x0",942,96,7,1,0,"0x1260504e0","0x0",911,96,7,1,0,"0x126050540","0x0",996,96,7,1,0,"0x1260505a0","0x0",1081,96,7,1,0,"0x126050600","0x0",1107,96,7,1,0,"0x126050660","0x0",1124,96,7,1,0,"0x1260506c0","0x0",1137,96,7,1,0,"0x126050720","0x0",1158,96,7,1,0,"0x126050780","0x0",1183,96,7,1,0,"0x1260507e0","0x0",1203,96,7,1,0,"0x126050840","0x0",1234,96,7,1,0,"0x1260508a0","0x0",1300,96,7,1,0,"0x126050900","0x0",1317,96,7,1,0,"0x126050960","0x0",1393,96,7,1,0,"0x1260509c0","0x0",1417,96,7,1,0,"0x126050a20","0x0",1152,96,7,1,0,"0x126050a80","0x0",1512,96,7,1,0,"0x126050ae0","0x0",1202,96,7,1,0,"0x126050b40","0x0",1353,96,7,1,0,"0x126050ba0","0x0",1231,96,7,1,0,"0x126050c00","0x0",1380,96,7,1,0,"0x126050c60","0x0",1413,96,7,1,0,"0x126050cc0","0x0",1466,96,7,1,0,"0x126050d20","0x0",1491,96,7,1,0,"0x126050d80","0x0",1443,96,7,1,0,"0x126050de0","0x0",1323,96,7,1,0,"0x126050e40","0x0",2202,96,7,1,0,"0x126050ea0","0x0",2210,96,7,1,0,"0x126050f00","0x0",1146,96,7,1,0,"0x126050f60","0x0",1176,96,7,1,0,"0x126050fc0","0x0",1173,96,7,1,0,"0x126051020","0x0",1191,96,7,1,0,"0x126051080","0x0",1221,96,7,1,0,"0x1260510e0","0x0",1241,96,7,1,0,"0x126051140","0x0",1259,96,7,1,0,"0x1260511a0","0x0",1275,96,7,1,0,"0x126051200","0x0",1293,96,7,1,0,"0x126051260","0x0",1310,96,7,1,0,"0x1260512c0","0x0",1330,96,7,1,0,"0x126051320","0x0",1342,96,7,1,0,"0x126051380","0x0",1364,96,7,1,0,"0x1260513e0","0x0",1381,96,7,1,0,"0x126051440","0x0",1405,96,7,1,0,"0x1260514a0","0x0",1425,96,7,1,0,"0x126051500","0x0",1472,96,7,1,0,"0x126051560","0x0",1502,96,7,1,0,"0x1260515c0","0x0",1516,96,7,1,0,"0x126051620","0x0",1530,96,7,1,0,"0x126051680","0x0",1560,96,7,1,0,"0x1260516e0","0x0",1586,96,7,1,0,"0x126051740","0x0",1603,96,7,1,0,"0x1260517a0","0x0",1629,96,7,1,0,"0x126051800","0x0",1642,96,7,1,0,"0x126051860","0x0",1673,96,7,1,0,"0x1260518c0","0x0",1702,96,7,1,0,"0x126051920","0x0",1162,96,7,1,0,"0x126051980","0x0",926,96,7,1,0,"0x1260519e0","0x0",1212,96,7,1,0,"0x126051a40","0x0",1240,96,7,1,0,"0x126051aa0","0x0",1257,96,7,1,0,"0x126051b00","0x0",1282,96,7,1,0,"0x126051b60","0x0",1302,96,7,1,0,"0x126051bc0","0x0",1316,96,7,1,0,"0x126051c20","0x0",1352,96,7,1,0,"0x126051c80","0x0",1437,96,7,1,0,"0x126051ce0","0x0",1216,96,7,1,0,"0x126051d40","0x0",1244,96,7,1,0,"0x126051da0","0x0",1261,96,7,1,0,"0x126051e00","0x0",1287,96,7,1,0,"0x126051e60","0x0",1301,96,7,1,0,"0x126051ec0","0x0",1325,96,7,1,0,"0x126051f20","0x0",1388,96,7,1,0,"0x126051f80","0x0",2240,96,7,1,0,"0x126051fe0","0x0",2243,96,7,1,0,"0x126052040","0x0",2246,96,7,1,0,"0x1260520a0","0x0",2249,96,7,1,0,"0x126052100","0x0",898,96,7,1,0,"0x126052160","0x0",2260,96,7,1,0,"0x1260521c0","0x0",2358,96,7,1,0,"0x126052220","0x0",2367,96,7,1,0,"0x126052280","0x0",2303,96,7,1,0,"0x1260522e0","0x0",1138,96,7,1,0,"0x126052340","0x0",1059,96,7,1,0,"0x1260523a0","0x0",2312,96,7,1,0,"0x126052400","0x0",2305,96,7,1,0,"0x126052460","0x0",2323,96,7,1,0,"0x1260524c0","0x0",640,96,7,1,0,"0x126052520","0x0",648,96,7,1,0,"0x126052580","0x0",663,96,7,1,0,"0x1260525e0","0x0",677,96,7,1,0,"0x126052640","0x0",699,96,7,1,0,"0x1260526a0","0x0",543,96,7,1,0,"0x126052700","0x0",554,96,7,1,0,"0x126052760","0x0",538,96,7,1,0,"0x1260527c0","0x0",535,96,7,1,0,"0x126052820","0x0",542,96,7,1,0,"0x126052880","0x0",533,96,7,1,0,"0x1260528e0","0x0",545,96,7,1,0,"0x126052940","0x0",556,96,7,1,0,"0x1260529a0","0x0",571,96,7,1,0,"0x126052a00","0x0",598,96,7,1,0,"0x126052a60","0x0",620,96,7,1,0,"0x126052ac0","0x0",899,96,7,1,0,"0x126052b20","0x0",912,96,7,1,0,"0x126052b80","0x0",814,96,7,1,0,"0x126052be0","0x0",807,96,7,1,0,"0x126052c40","0x0",830,96,7,1,0,"0x126052ca0","0x0",842,96,7,1,0,"0x126052d00","0x0",1757,96,7,1,0,"0x126052d60","0x0",1770,96,7,1,0,"0x126052dc0","0x0",1778,96,7,1,0,"0x126052e20","0x0",1783,96,7,1,0,"0x126052e80","0x0",1788,96,7,1,0,"0x126052ee0","0x0",1795,96,7,1,0,"0x126052f40","0x0",1800,96,7,1,0,"0x126052fa0","0x0",549,96,7,1,0,"0x126053000","0x0",753,96,7,1,0,"0x126053060","0x0",854,96,7,1,0,"0x1260530c0","0x0",1281,96,7,1,0,"0x126053120","0x0",1535,96,7,1,0,"0x126053180","0x0",1547,96,7,1,0,"0x1260531e0","0x0",1561,96,7,1,0,"0x126053240","0x0",1578,96,7,1,0,"0x1260532a0","0x0",1653,96,7,1,0,"0x126053300","0x0",1672,96,7,1,0,"0x126053360","0x0",1684,96,7,1,0,"0x1260533c0","0x0",1707,96,7,1,0,"0x126053420","0x0",1723,96,7,1,0,"0x126053480","0x0",1737,96,7,1,0,"0x1260534e0","0x0",1806,96,7,1,0,"0x126053540","0x0",1859,96,7,1,0,"0x1260535a0","0x0",1863,96,7,1,0,"0x126053600","0x0",1870,96,7,1,0,"0x126053660","0x0",1882,96,7,1,0,"0x1260536c0","0x0",1901,96,7,1,0,"0x126053720","0x0",2153,96,7,1,0,"0x126053780","0x0",2162,96,7,1,0,"0x1260537e0","0x0",2332,96,7,1,0,"0x126053840","0x0",2350,96,7,1,0,"0x1260538a0","0x0",334,96,7,1,0,"0x126053900","0x0",339,96,7,1,0,"0x126053960","0x0",342,96,7,1,0,"0x1260539c0","0x0",1619,96,7,1,0,"0x126053a20","0x0",1639,96,7,1,0,"0x126053a80","0x0",1664,96,7,1,0,"0x126053ae0","0x0",1692,96,7,1,0,"0x126053b40","0x0",1706,96,7,1,0,"0x126053ba0","0x0",1730,96,7,1,0,"0x126053c00","0x0",1756,96,7,1,0,"0x126053c60","0x0",1774,96,7,1,0,"0x126053cc0","0x0",1784,96,7,1,0,"0x126053d20","0x0",1791,96,7,1,0,"0x126053d80","0x0",1799,96,7,1,0,"0x126053de0","0x0",1807,96,7,1,0,"0x126053e40","0x0",1885,176,45,1,0,"0x1261116b0","0x0",1875,176,45,1,0,"0x126112d60","0x0",1877,176,45,1,0,"0x1261132e0","0x0",1935,176,45,1,0,"0x126113390","0x0",1926,176,45,1,0,"0x126113650","0x0",1929,176,45,1,0,"0x126113910","0x0",1915,176,45,1,0,"0x1261139c0","0x0",1906,176,45,1,0,"0x126113a70","0x0",1904,176,45,1,0,"0x126113b20","0x0",1907,176,45,1,0,"0x126113c80","0x0",1905,176,45,1,0,"0x126113d30","0x0",875,176,45,1,0,"0x1261e8420","0x0",2361,176,45,1,0,"0x1261e84d0","0x0",2339,176,45,1,0,"0x1261e8580","0x0",777,176,45,1,0,"0x1261e9d90","0x0",1232,176,45,1,0,"0x1261e9e40","0x0",1341,176,45,1,0,"0x1261ea1b0","0x0",1387,176,45,1,0,"0x1261ea260","0x0",1153,176,45,1,0,"0x1261ea310","0x0",1454,176,45,1,0,"0x1261ea9f0","0x0",1044,176,45,1,0,"0x1261eac00","0x0",973,176,45,1,0,"0x1261ead60","0x0",1354,176,45,1,0,"0x1261eb230","0x0",1324,176,45,1,0,"0x1261eb2e0","0x0",1888,32,46,1,0,"0x126300320","0x0",1873,32,46,1,0,"0x1263004c0","0x0",1884,32,46,1,0,"0x126300500","0x0",1887,32,46,1,0,"0x126300520","0x0",1878,32,46,1,0,"0x126300660","0x0",1881,32,46,1,0,"0x126300680","0x0",1937,32,46,1,0,"0x1263006c0","0x0",1927,32,46,1,0,"0x1263006e0","0x0",1933,32,46,1,0,"0x126300720","0x0",1921,32,46,1,0,"0x126300840","0x0",1913,32,46,1,0,"0x1263008c0","0x0",1912,32,46,1,0,"0x1263008e0","0x0",1910,32,46,1,0,"0x126300920","0x0",1908,32,46,1,0,"0x126300960","0x0",1903,32,46,1,0,"0x126300a80","0x0",2013,32,46,1,0,"0x126300b20","0x0",1971,32,46,1,0,"0x126300b40","0x0",2067,32,46,1,0,"0x1263011a0","0x0",2035,32,46,1,0,"0x1263011e0","0x0",1989,32,46,1,0,"0x126301200","0x0",2005,32,46,1,0,"0x126301220","0x0",1964,32,46,1,0,"0x126301240","0x0",2028,32,46,1,0,"0x126301260","0x0",2016,32,46,1,0,"0x126301280","0x0",1986,32,46,1,0,"0x1263012c0","0x0",2009,32,46,1,0,"0x1263012e0","0x0",2030,32,46,1,0,"0x126301300","0x0",1961,32,46,1,0,"0x126301320","0x0",1993,32,46,1,0,"0x126301340","0x0",2050,32,46,1,0,"0x126301360","0x0",2018,32,46,1,0,"0x126301380","0x0",1980,32,46,1,0,"0x1263013c0","0x0",2061,32,46,1,0,"0x1263013e0","0x0",2058,32,46,1,0,"0x126301420","0x0",2065,32,46,1,0,"0x126301440","0x0",1954,32,46,1,0,"0x126301460","0x0",1949,32,46,1,0,"0x126301480","0x0",1938,32,46,1,0,"0x126301500","0x0",2095,32,46,1,0,"0x126301520","0x0",1943,32,46,1,0,"0x126301540","0x0",1973,32,46,1,0,"0x126301560","0x0",2000,32,46,1,0,"0x1263015a0","0x0",2046,32,46,1,0,"0x1263015c0","0x0",1976,32,46,1,0,"0x126301620","0x0",2041,32,46,1,0,"0x126301640","0x0",2087,32,46,1,0,"0x126301760","0x0",2139,32,46,1,0,"0x126301780","0x0",2076,32,46,1,0,"0x126301880","0x0",2088,32,46,1,0,"0x1263018c0","0x0",2168,32,46,1,0,"0x126301980","0x0",2182,32,46,1,0,"0x1263019a0","0x0",2154,32,46,1,0,"0x126301a60","0x0",2102,32,46,1,0,"0x126301a80","0x0",2146,32,46,1,0,"0x126301aa0","0x0",2144,32,46,1,0,"0x126301ce0","0x0",2122,32,46,1,0,"0x126301d00","0x0",2105,32,46,1,0,"0x126301da0","0x0",2117,32,46,1,0,"0x126301dc0","0x0",2124,32,46,1,0,"0x126301de0","0x0",2116,32,46,1,0,"0x126301e00","0x0",2177,32,46,1,0,"0x126301e80","0x0",2171,32,46,1,0,"0x126301f00","0x0",2053,32,46,1,0,"0x126301f20","0x0",2204,32,46,1,0,"0x126301fa0","0x0",2108,32,46,1,0,"0x126301fc0","0x0",2134,32,46,1,0,"0x126301fe0","0x0",2158,32,46,1,0,"0x126302040","0x0",2079,32,46,1,0,"0x126302080","0x0",2081,32,46,1,0,"0x1263020a0","0x0",2150,32,46,1,0,"0x1263020e0","0x0",2191,32,46,1,0,"0x126302100","0x0",2187,32,46,1,0,"0x126302140","0x0",2178,32,46,1,0,"0x1263021c0","0x0",2200,32,46,1,0,"0x1263021e0","0x0",1846,32,46,1,0,"0x126302200","0x0",1850,32,46,1,0,"0x126302220","0x0",1842,32,46,1,0,"0x126302240","0x0",2207,32,46,1,0,"0x1263023a0","0x0",1854,32,46,1,0,"0x1263023c0","0x0",2194,32,46,1,0,"0x1263023e0","0x0",1833,32,46,1,0,"0x1263024a0","0x0",1815,32,46,1,0,"0x1263024c0","0x0",1838,32,46,1,0,"0x1263024e0","0x0",1825,32,46,1,0,"0x126302500","0x0",1286,32,46,1,0,"0x126302520","0x0",798,32,46,1,0,"0x1263025e0","0x0",739,32,46,1,0,"0x126302600","0x0",754,32,46,1,0,"0x126302620","0x0",948,32,46,1,0,"0x126302660","0x0",922,32,46,1,0,"0x126302680","0x0",903,32,46,1,0,"0x1263026c0","0x0",586,32,46,1,0,"0x1263026e0","0x0",553,32,46,1,0,"0x126302720","0x0",605,32,46,1,0,"0x126302960","0x0",575,32,46,1,0,"0x126302980","0x0",593,32,46,1,0,"0x126302a40","0x0",561,32,46,1,0,"0x126302a60","0x0",591,32,46,1,0,"0x126302a80","0x0",572,32,46,1,0,"0x126302be0","0x0",588,32,46,1,0,"0x126302c00","0x0",565,32,46,1,0,"0x126302c20","0x0",603,32,46,1,0,"0x126302d60","0x0",573,32,46,1,0,"0x126302da0","0x0",618,32,46,1,0,"0x126302fa0","0x0",582,32,46,1,0,"0x126302fc0","0x0",646,32,46,1,0,"0x126303100","0x0",622,32,46,1,0,"0x126303120","0x0",655,32,46,1,0,"0x126303160","0x0",627,32,46,1,0,"0x126303180","0x0",656,32,46,1,0,"0x1263031a0","0x0",615,32,46,1,0,"0x1263031c0","0x0",665,32,46,1,0,"0x126303220","0x0",630,32,46,1,0,"0x126303380","0x0",667,32,46,1,0,"0x1263033a0","0x0",629,32,46,1,0,"0x126303540","0x0",671,32,46,1,0,"0x126303560","0x0",634,32,46,1,0,"0x126303660","0x0",684,32,46,1,0,"0x126303680","0x0",649,32,46,1,0,"0x126303840","0x0",706,32,46,1,0,"0x126303860","0x0",681,32,46,1,0,"0x1263038a0","0x0",696,32,46,1,0,"0x1263038c0","0x0",672,32,46,1,0,"0x126303c40","0x0",720,32,46,1,0,"0x126303c60","0x0",688,32,46,1,0,"0x126303cc0","0x0",730,32,46,1,0,"0x126303ce0","0x0",698,32,46,1,0,"0x126303d20","0x0",745,32,46,1,0,"0x126303dc0","0x0",709,32,46,1,0,"0x126303de0","0x0",841,32,46,1,0,"0x126303e60","0x0",708,32,46,1,0,"0x126303e80","0x0",1469,50,6,0,57,"0x126380060","0x0",1439,48,6,0,58,"0x126380090","0x0",1422,50,6,0,59,"0x1263800c0","0x0",1401,50,6,0,60,"0x126380210","0x0",1374,50,6,0,61,"0x1263802a0","0x0",1362,50,6,0,62,"0x1263802d0","0x0",1339,50,6,0,63,"0x126380300","0x0",1326,50,6,0,64,"0x126380330","0x0",1308,50,6,0,64,"0x126380360","0x0",1291,50,6,0,65,"0x126380390","0x0",1270,50,6,0,66,"0x1263803c0","0x0",1253,50,6,0,67,"0x1263803f0","0x0",1239,50,6,0,68,"0x126380450","0x0",1213,50,6,0,69,"0x126380480","0x0",1187,50,6,0,70,"0x1263804e0","0x0",1169,50,6,0,71,"0x126380510","0x0",1038,48,6,0,72,"0x126380540","0x0",962,48,6,0,73,"0x126380570","0x0",1172,50,6,0,74,"0x1263805a0","0x0",1140,50,6,0,63,"0x1263805d0","0x0",2209,50,6,0,75,"0x126380600","0x0",2197,50,6,0,76,"0x126380630","0x0",1340,48,6,0,77,"0x126380660","0x0",1315,48,6,0,78,"0x1263806c0","0x0",1290,48,6,0,79,"0x1263806f0","0x0",1605,48,6,0,80,"0x126380720","0x0",1246,48,6,0,81,"0x126380780","0x0",1321,50,6,0,82,"0x1263807e0","0x0",1440,50,6,0,83,"0x126380810","0x0",1485,50,6,0,84,"0x126380840","0x0",1464,50,6,0,85,"0x126380930","0x0",1407,50,6,0,86,"0x126380960","0x0",1377,50,6,0,87,"0x126380990","0x0",1228,50,6,0,88,"0x1263809f0","0x0",1348,50,6,0,89,"0x126380a20","0x0",1196,50,6,0,71,"0x126380a50","0x0",1509,50,6,0,90,"0x126380a80","0x0",1149,50,6,0,91,"0x126380ab0","0x0",1683,48,6,0,92,"0x126380ae0","0x0",1655,48,6,0,93,"0x126380b10","0x0",1606,48,6,0,94,"0x126380b40","0x0",1565,48,6,0,95,"0x126380ba0","0x0",1768,48,6,0,96,"0x126380c00","0x0",1711,48,6,0,97,"0x126380c30","0x0",1541,48,6,0,98,"0x126380c60","0x0",1514,48,6,0,99,"0x126380c90","0x0",1494,48,6,0,100,"0x126380cc0","0x0",1474,48,6,0,101,"0x126380cf0","0x0",1446,48,6,0,102,"0x126380d20","0x0",1424,48,6,0,103,"0x126380d50","0x0",1411,50,6,0,65,"0x126380d80","0x0",1382,50,6,0,66,"0x126380db0","0x0",1363,48,6,0,104,"0x126380de0","0x0",1738,48,6,0,105,"0x126380e10","0x0",1335,48,6,0,106,"0x126380e70","0x0",1312,50,6,0,107,"0x126380ea0","0x0",1295,50,6,0,108,"0x126380ed0","0x0",1256,48,6,0,109,"0x126381110","0x0",1222,50,6,0,63,"0x126381170","0x0",1198,50,6,0,64,"0x1263811a0","0x0",1181,50,6,0,110,"0x1263811d0","0x0",1154,50,6,0,111,"0x126381200","0x0",1133,50,6,0,64,"0x126381230","0x0",1121,50,6,0,112,"0x126381260","0x0",1105,50,6,0,113,"0x126381320","0x0",1072,50,6,0,114,"0x126381380","0x0",1024,48,6,0,115,"0x1263813b0","0x0",1009,48,6,0,116,"0x126381410","0x0",993,50,6,0,117,"0x126381470","0x0",906,48,6,0,118,"0x1263814a0","0x0",909,50,6,0,71,"0x1263814d0","0x0",1518,48,6,0,119,"0x126381500","0x0",938,49,6,0,0,"0x126381530","0x0",1123,50,6,0,120,"0x126381560","0x0",1142,50,6,0,121,"0x126381590","0x0",1092,50,6,0,122,"0x1263815c0","0x0",1082,50,6,0,123,"0x1263815f0","0x0",1071,50,6,0,124,"0x126381620","0x0",1051,50,6,0,125,"0x126381680","0x0",1035,50,6,0,126,"0x1263816b0","0x0",1025,50,6,0,127,"0x1263816e0","0x0",1000,50,6,0,128,"0x126381710","0x0",920,50,6,0,70,"0x126381740","0x0",985,50,6,0,117,"0x126381770","0x0",959,50,6,0,71,"0x1263817a0","0x0",919,48,6,0,129,"0x1263817d0","0x0",928,48,6,0,130,"0x126381800","0x0",984,48,6,0,131,"0x126381860","0x0",888,48,6,0,132,"0x126381890","0x0",895,48,6,0,133,"0x1263818c0","0x0",969,50,6,0,71,"0x1263818f0","0x0",727,112,8,1,6,"0x1264f0c40","0x0",737,112,8,1,6,"0x1264f1570","0x0",2378,112,8,1,6,"0x1264f1650","0x0",2322,112,8,1,6,"0x1264f17a0","0x0",2331,112,8,1,6,"0x1264f1b90","0x0",2329,112,8,1,6,"0x1264f1c70","0x0",2340,112,8,1,6,"0x1264f24c0","0x0",2325,112,8,1,6,"0x1264f32c0","0x0",2334,112,8,1,6,"0x1264f33a0","0x0",2126,176,45,1,0,"0x1266d5760","0x0",2086,176,45,1,0,"0x1266d5ad0","0x0",2021,176,45,1,0,"0x1266d5b80","0x0",1963,176,45,1,0,"0x1266d61b0","0x0",1928,176,45,1,0,"0x1266d6260","0x0",1867,176,45,1,0,"0x1266d72e0","0x0",1886,176,45,1,0,"0x1266d7910","0x0",1871,176,45,1,0,"0x1266d7d30","0x0",1883,176,45,1,0,"0x1266d7de0","0x0",1110,112,8,1,134,"0x1267380e0","0x0",1111,112,8,1,3,"0x126738770","0x0",1104,112,8,1,3,"0x1267388c0","0x0",1113,112,8,1,3,"0x126739030","0x0",1109,112,8,1,22,"0x1267390a0","0x0",1373,112,8,1,2,"0x126739110","0x0",1079,112,8,1,3,"0x126739dc0","0x0",1083,112,8,1,3,"0x126739e30","0x0",1078,112,8,1,3,"0x126739ea0","0x0",1074,112,8,1,3,"0x126739f10","0x0",1076,112,8,1,3,"0x126739f80","0x0",1066,112,8,1,3,"0x12673abc0","0x0",1070,112,8,1,3,"0x12673ac30","0x0",1068,112,8,1,3,"0x12673ae60","0x0",1058,112,8,1,3,"0x12673aed0","0x0",1782,112,8,1,2,"0x12673b1e0","0x0",1786,112,8,1,2,"0x12673b800","0x0",2379,112,8,1,6,"0x12676c000","0x0",2392,112,8,1,6,"0x12676c150","0x0",2365,112,8,1,6,"0x12676c310","0x0",2355,112,8,1,6,"0x12676c4d0","0x0",2218,112,8,1,6,"0x12676c770","0x0",2219,112,8,1,6,"0x12676c7e0","0x0",2255,112,8,1,6,"0x12676c8c0","0x0",2214,112,8,1,6,"0x12676ca10","0x0",2251,112,8,1,6,"0x12676cf50","0x0",1266,112,8,1,135,"0x12676d110","0x0",1351,112,8,1,135,"0x12676d180","0x0",1255,112,8,1,136,"0x12676d1f0","0x0",1249,112,8,1,137,"0x12676d260","0x0",1218,112,8,1,138,"0x12676d2d0","0x0",1251,112,8,1,139,"0x12676d3b0","0x0",1207,112,8,1,140,"0x12676d490","0x0",1421,112,8,1,140,"0x12676d500","0x0",1195,112,8,1,141,"0x12676d5e0","0x0",1448,112,8,1,141,"0x12676d650","0x0",1080,112,8,1,142,"0x12676e0d0","0x0",966,112,8,1,2,"0x12676e1b0","0x0",1188,112,8,1,143,"0x12676e300","0x0",1199,112,8,1,143,"0x12676e370","0x0",1178,112,8,1,144,"0x12676e3e0","0x0",1171,112,8,1,144,"0x12676e450","0x0",1095,112,8,1,145,"0x12676e680","0x0",1182,112,8,1,145,"0x12676e6f0","0x0",1130,112,8,1,146,"0x12676e8b0","0x0",1726,112,8,1,146,"0x12676e920","0x0",1010,112,8,1,147,"0x12676e990","0x0",1006,112,8,1,148,"0x12676ea70","0x0",1063,112,8,1,149,"0x12676eae0","0x0",988,112,8,1,150,"0x12676eb50","0x0",1125,112,8,1,151,"0x12676ebc0","0x0",1189,112,8,1,152,"0x12676ed10","0x0",1120,112,8,1,153,"0x12676f790","0x0",1118,112,8,1,154,"0x12676fbf0","0x0",1119,112,8,1,154,"0x12676fc60","0x0",1117,112,8,1,155,"0x12676fdb0","0x0",1481,51,6,0,0,"0x126836f70","0x0",1470,51,6,0,0,"0x126836fa0","0x0",1462,51,6,0,0,"0x126836fd0","0x0",1442,51,6,0,0,"0x126837000","0x0",1403,51,6,0,0,"0x126837030","0x0",1391,51,6,0,0,"0x126837060","0x0",1378,51,6,0,0,"0x126837090","0x0",1032,51,48,0,0,"0x1268370c0","0x0",1005,51,33,0,0,"0x1268370f0","0x0",979,51,34,0,0,"0x126837120","0x0",714,52,6,0,0,"0x126837150","0x0",2314,54,6,0,0,"0x126837180","0x0",2304,52,6,0,0,"0x1268371b0","0x0",2306,52,6,0,0,"0x1268371e0","0x0",2318,51,6,0,0,"0x126837210","0x0",2336,62,6,0,0,"0x126837240","0x0",2354,63,6,0,0,"0x126837270","0x0",2349,51,6,0,0,"0x1268372a0","0x0",2253,53,6,0,0,"0x1268372d0","0x0",2212,51,6,0,0,"0x126837300","0x0",2237,55,6,0,0,"0x126837330","0x0",887,49,6,0,0,"0x126837360","0x0",882,49,6,0,0,"0x126837390","0x0",946,58,6,0,0,"0x1268373c0","0x0",1185,67,6,0,0,"0x12683fe00","0x0",1520,48,49,1,0,"0x12685d710","0x0",1532,48,49,1,0,"0x12685d770","0x0",1834,48,49,1,0,"0x12685d7d0","0x0",2395,48,49,1,0,"0x12685d800","0x0",345,48,49,1,0,"0x12685d830","0x0",2385,48,49,1,0,"0x12685d860","0x0",2366,48,49,1,0,"0x12685d890","0x0",1508,48,49,1,0,"0x12685d920","0x0",1493,48,49,1,0,"0x12685d950","0x0",1510,48,49,1,0,"0x12685d980","0x0",1482,48,49,1,0,"0x12685d9b0","0x0",1501,48,49,1,0,"0x12685d9e0","0x0",1488,48,49,1,0,"0x12685da10","0x0",1476,48,49,1,0,"0x12685dad0","0x0",1463,48,49,1,0,"0x12685db00","0x0",1435,48,49,1,0,"0x12685db30","0x0",1418,48,49,1,0,"0x12685db60","0x0",1426,48,49,1,0,"0x12685db90","0x0",1412,48,49,1,0,"0x12685dbc0","0x0",1271,48,49,1,0,"0x12685dbf0","0x0",1415,48,49,1,0,"0x12685dc20","0x0",1402,48,49,1,0,"0x12685dc50","0x0",885,48,49,1,0,"0x12685dc80","0x0",783,48,49,1,0,"0x12685dcb0","0x0",790,48,49,1,0,"0x12685dce0","0x0",965,48,49,1,0,"0x12685dd70","0x0",829,48,49,1,0,"0x12685df20","0x0",2345,48,49,1,0,"0x12685df80","0x0",2343,48,49,1,0,"0x12685dfe0","0x0",1247,48,49,1,0,"0x12685e010","0x0",1227,48,49,1,0,"0x12685e040","0x0",1097,48,49,1,0,"0x12685e070","0x0",1090,48,49,1,0,"0x12685e0a0","0x0",1174,48,49,1,0,"0x12685e0d0","0x0",1168,48,49,1,0,"0x12685e100","0x0",982,48,49,1,0,"0x12685e130","0x0",967,48,49,1,0,"0x12685e160","0x0",1045,48,49,1,0,"0x12685e1c0","0x0",1056,48,49,1,0,"0x12685e1f0","0x0",1031,48,49,1,0,"0x12685e220","0x0",1041,48,49,1,0,"0x12685e250","0x0",998,48,49,1,0,"0x12685e280","0x0",1018,48,49,1,0,"0x12685e2b0","0x0",740,48,49,1,0,"0x12685e460","0x0",2380,48,49,1,0,"0x12685e4c0","0x0",2333,48,49,1,0,"0x12685e550","0x0",2344,48,49,1,0,"0x12685e5b0","0x0",2327,48,49,1,0,"0x12685e5e0","0x0",1201,48,49,1,0,"0x12685e610","0x0",2337,48,49,1,0,"0x12685e640","0x0",2383,48,49,1,0,"0x12685e670","0x0",2394,48,49,1,0,"0x12685e6d0","0x0",2370,48,49,1,0,"0x12685e700","0x0",2357,48,49,1,0,"0x12685e790","0x0",2220,48,49,1,0,"0x12685e850","0x0",2256,48,49,1,0,"0x12685e880","0x0",2215,48,49,1,0,"0x12685e8e0","0x0",2252,48,49,1,0,"0x12685e940","0x0",1361,48,49,1,0,"0x12685e970","0x0",1250,48,49,1,0,"0x12685e9a0","0x0",1254,48,49,1,0,"0x12685e9d0","0x0",1423,48,49,1,0,"0x12685ea60","0x0",1450,48,49,1,0,"0x12685eac0","0x0",968,48,49,1,0,"0x12685eb20","0x0",1175,48,49,1,0,"0x12685eb50","0x0",1186,48,49,1,0,"0x12685eb80","0x0",1728,48,49,1,0,"0x12685ebb0","0x0",1015,48,49,1,0,"0x12685ebe0","0x0",1008,48,49,1,0,"0x12685ec10","0x0",1065,48,49,1,0,"0x12685ec40","0x0",991,48,49,1,0,"0x12685ec70","0x0",1192,48,49,1,0,"0x12685eca0","0x0",1375,48,49,1,0,"0x12685ed30","0x0",1816,48,49,1,0,"0x12685ee20","0x0",1043,48,49,1,0,"0x12685eeb0","0x0",1160,48,49,1,0,"0x12685ef40","0x0",884,112,50,1,0,"0x126865dc0","0x0",2181,112,50,1,0,"0x126865ff0","0x0",908,160,51,1,0,"0x127028000","0x0",897,160,51,1,0,"0x1270280a0","0x0",1001,160,51,1,0,"0x127028140","0x0",941,160,51,1,0,"0x1270281e0","0x0",631,160,51,1,0,"0x127028280","0x0",1540,160,51,1,0,"0x127028320","0x0",917,160,51,1,0,"0x1270283c0","0x0",1019,160,51,1,0,"0x127028460","0x0",1062,160,51,1,0,"0x127028500","0x0",1288,160,51,1,0,"0x1270285a0","0x0",1349,160,51,1,0,"0x127028640","0x0",1755,160,51,1,0,"0x1270286e0","0x0",1370,160,51,1,0,"0x127028780","0x0",1438,160,51,1,0,"0x127028820","0x0",1460,160,51,1,0,"0x1270288c0","0x0",1489,160,51,1,0,"0x127028960","0x0",1507,160,51,1,0,"0x127028a00","0x0",1533,160,51,1,0,"0x127028aa0","0x0",1552,160,51,1,0,"0x127028b40","0x0",1724,160,51,1,0,"0x127028be0","0x0",1775,160,51,1,0,"0x127028c80","0x0",1595,160,51,1,0,"0x127028d20","0x0",1635,160,51,1,0,"0x127028dc0","0x0",1674,160,51,1,0,"0x127028e60","0x0",1700,160,51,1,0,"0x127028f00","0x0",1277,160,51,1,0,"0x127028fa0","0x0",1631,160,51,1,0,"0x127029040","0x0",1297,160,51,1,0,"0x1270290e0","0x0",1334,160,51,1,0,"0x127029180","0x0",1359,160,51,1,0,"0x127029220","0x0",976,160,51,1,0,"0x1270292c0","0x0",1050,160,51,1,0,"0x127029360","0x0",1461,160,51,1,0,"0x127029400","0x0",1159,160,51,1,0,"0x1270294a0","0x0",1392,160,51,1,0,"0x127029540","0x0",1350,160,51,1,0,"0x1270295e0","0x0",1236,160,51,1,0,"0x127029680","0x0",782,160,51,1,0,"0x127029720","0x0",2346,160,51,1,0,"0x1270297c0","0x0",2368,160,51,1,0,"0x127029860","0x0",883,160,51,1,0,"0x127029900","0x0",881,160,51,1,0,"0x1270299a0","0x0",872,160,51,1,0,"0x127029a40","0x0",862,160,51,1,0,"0x127029ae0","0x0",867,160,51,1,0,"0x127029b80","0x0",869,160,51,1,0,"0x127029c20","0x0",851,160,51,1,0,"0x127029cc0","0x0",847,160,51,1,0,"0x127029d60","0x0",828,160,51,1,0,"0x127029e00","0x0",840,160,51,1,0,"0x127029ea0","0x0",816,160,51,1,0,"0x127029f40","0x0",861,160,51,1,0,"0x127029fe0","0x0",809,160,51,1,0,"0x12702a080","0x0",796,160,51,1,0,"0x12702a120","0x0",805,160,51,1,0,"0x12702a1c0","0x0",793,160,51,1,0,"0x12702a260","0x0",776,160,51,1,0,"0x12702a300","0x0",769,160,51,1,0,"0x12702a3a0","0x0",771,160,51,1,0,"0x12702a440","0x0",766,160,51,1,0,"0x12702a4e0","0x0",761,160,51,1,0,"0x12702a580","0x0",744,160,51,1,0,"0x12702a620","0x0",728,160,51,1,0,"0x12702a6c0","0x0",721,160,51,1,0,"0x12702a760","0x0",836,160,51,1,0,"0x12702a800","0x0",711,160,51,1,0,"0x12702a8a0","0x0",844,160,51,1,0,"0x12702a940","0x0",713,160,51,1,0,"0x12702a9e0","0x0",747,160,51,1,0,"0x12702aa80","0x0",701,160,51,1,0,"0x12702ab20","0x0",733,160,51,1,0,"0x12702abc0","0x0",691,160,51,1,0,"0x12702ac60","0x0",732,160,51,1,0,"0x12702ad00","0x0",680,160,51,1,0,"0x12702ada0","0x0",700,160,51,1,0,"0x12702ae40","0x0",685,160,51,1,0,"0x12702aee0","0x0",710,160,51,1,0,"0x12702af80","0x0",653,160,51,1,0,"0x12702b020","0x0",687,160,51,1,0,"0x12702b0c0","0x0",643,160,51,1,0,"0x12702b160","0x0",676,160,51,1,0,"0x12702b200","0x0",635,160,51,1,0,"0x12702b2a0","0x0",678,160,51,1,0,"0x12702b340","0x0",637,160,51,1,0,"0x12702b3e0","0x0",673,160,51,1,0,"0x12702b480","0x0",617,160,51,1,0,"0x12702b520","0x0",660,160,51,1,0,"0x12702b5c0","0x0",658,160,51,1,0,"0x12702b660","0x0",624,160,51,1,0,"0x12702b700","0x0",650,160,51,1,0,"0x12702b7a0","0x0",585,160,51,1,0,"0x12702b840","0x0",626,160,51,1,0,"0x12702b8e0","0x0",577,160,51,1,0,"0x12702b980","0x0",606,160,51,1,0,"0x12702ba20","0x0",567,160,51,1,0,"0x12702bac0","0x0",597,160,51,1,0,"0x12702bb60","0x0",576,160,51,1,0,"0x12702bc00","0x0",599,160,51,1,0,"0x12702bca0","0x0",568,160,51,1,0,"0x12702bd40","0x0",596,160,51,1,0,"0x12702bde0","0x0",644,176,45,1,0,"0x127098370","0x0",621,176,45,1,0,"0x127098790","0x0",651,176,45,1,0,"0x127098d10","0x0",623,176,45,1,0,"0x127098fd0","0x0",654,176,45,1,0,"0x127099970","0x0",613,176,45,1,0,"0x127099a20","0x0",661,176,45,1,0,"0x127099ad0","0x0",628,176,45,1,0,"0x127099ce0","0x0",664,176,45,1,0,"0x12709a470","0x0",625,176,45,1,0,"0x12709a5d0","0x0",668,176,45,1,0,"0x12709a680","0x0",632,176,45,1,0,"0x12709a7e0","0x0",682,176,45,1,0,"0x12709a940","0x0",647,176,45,1,0,"0x12709aaa0","0x0",703,176,45,1,0,"0x12709b2e0","0x0",679,176,45,1,0,"0x12709b5a0","0x0",692,176,45,1,0,"0x12709b860","0x0",670,176,45,1,0,"0x12709bb20","0x0",1372,32,52,0,0,"0x127292da0","0x0",1404,32,52,0,0,"0x127292dc0","0x0",1165,32,52,0,0,"0x127292e00","0x0",1128,36,53,0,0,"0x127292e20","0x0",1306,32,52,0,0,"0x127293040","0x0",1427,32,52,0,0,"0x127293060","0x0",1477,32,52,0,0,"0x127293080","0x0",1453,32,52,0,0,"0x1272930e0","0x0",1394,32,52,0,0,"0x127293300","0x0",1369,32,52,0,0,"0x127293360","0x0",1219,32,52,0,0,"0x127293380","0x0",1337,32,52,0,0,"0x127293480","0x0",1131,49,31,0,0,"0x1272934a0","0x0",977,72,54,0,0,"0x1272934e0","0x0",1511,32,52,0,0,"0x127293540","0x0",930,32,52,0,0,"0x1272935c0","0x0",1106,32,52,0,0,"0x127293640","0x0",871,32,55,0,0,"0x127293660","0x0",718,176,45,1,0,"0x1272a40b0","0x0",686,176,45,1,0,"0x1272a5550","0x0",726,176,45,1,0,"0x1272a5760","0x0",697,176,45,1,0,"0x1272a5810","0x0",743,176,45,1,0,"0x1272a58c0","0x0",705,176,45,1,0,"0x1272a5970","0x0",838,176,45,1,0,"0x1272a5a20","0x0",707,176,45,1,0,"0x1272a5ad0","0x0",824,176,45,1,0,"0x1272a5d90","0x0",715,176,45,1,0,"0x1272a6470","0x0",724,176,45,1,0,"0x1272a6890","0x0",735,176,45,1,0,"0x1272a7390","0x0",756,176,45,1,0,"0x1272a7860","0x0",574,176,45,1,0,"0x127391ad0","0x0",592,176,45,1,0,"0x127392470","0x0",560,176,45,1,0,"0x127392520","0x0",590,176,45,1,0,"0x1273925d0","0x0",569,176,45,1,0,"0x127392680","0x0",587,176,45,1,0,"0x1273929f0","0x0",562,176,45,1,0,"0x127392aa0","0x0",602,176,45,1,0,"0x1273935a0","0x0",570,176,45,1,0,"0x127393c80","0x0",616,176,45,1,0,"0x127393d30","0x0",581,176,45,1,0,"0x127393de0","0x0",1243,112,8,1,6,"0x1274c4700","0x0",1194,112,8,1,2,"0x1274c47e0","0x0",1224,112,8,1,2,"0x1274c4850","0x0",1094,112,8,1,6,"0x1274c48c0","0x0",1028,112,8,1,2,"0x1274c49a0","0x0",1085,112,8,1,2,"0x1274c4a10","0x0",1170,112,8,1,6,"0x1274c4a80","0x0",1114,112,8,1,2,"0x1274c53b0","0x0",1163,112,8,1,2,"0x1274c5420","0x0",978,112,8,1,6,"0x1274c5490","0x0",939,112,8,1,2,"0x1274c5570","0x0",963,112,8,1,2,"0x1274c55e0","0x0",2338,112,8,1,2,"0x1274c5650","0x0",1103,112,8,1,2,"0x1274c56c0","0x0",1115,112,8,1,2,"0x1274c5730","0x0",1102,112,8,1,156,"0x1274c57a0","0x0",1042,112,8,1,157,"0x1274c5810","0x0",1052,112,8,1,147,"0x1274c58f0","0x0",1101,112,8,1,158,"0x1274c5960","0x0",1020,112,8,1,158,"0x1274c59d0","0x0",1036,112,8,1,158,"0x1274c5ab0","0x0",1099,112,8,1,159,"0x1274c5b20","0x0",994,112,8,1,159,"0x1274c5b90","0x0",1017,112,8,1,159,"0x1274c5c70","0x0",2233,112,8,1,142,"0x1274c5ce0","0x0",2222,112,8,1,142,"0x1274c5d50","0x0",2229,112,8,1,6,"0x1274c5dc0","0x0",2230,112,8,1,6,"0x1274c5e30","0x0",2226,112,8,1,2,"0x1274c6370","0x0",2227,112,8,1,2,"0x1274c6840","0x0",2228,112,8,1,2,"0x1274c6990","0x0",2231,112,8,1,6,"0x1274c6a00","0x0",880,112,8,1,6,"0x1274c6a70","0x0",874,112,8,1,2,"0x1274c6ae0","0x0",1457,112,8,1,160,"0x1278525a0","0x0",1497,112,8,1,160,"0x127852610","0x0",1459,112,8,1,6,"0x127852680","0x0",1449,112,8,1,161,"0x127852760","0x0",1475,112,8,1,161,"0x1278527d0","0x0",1416,112,8,1,6,"0x1278528b0","0x0",1429,112,8,1,142,"0x127852990","0x0",1430,112,8,1,162,"0x127852a00","0x0",1408,112,8,1,6,"0x127852a70","0x0",1386,112,8,1,163,"0x127852c30","0x0",1420,112,8,1,163,"0x127852ca0","0x0",1399,112,8,1,6,"0x127852d10","0x0",1371,112,8,1,142,"0x127852df0","0x0",1409,112,8,1,164,"0x127852e60","0x0",1356,112,8,1,165,"0x127853090","0x0",1347,112,8,1,166,"0x1278532c0","0x0",1331,112,8,1,167,"0x127853330","0x0",1322,112,8,1,168,"0x1278533a0","0x0",1268,112,8,1,169,"0x127853410","0x0",1307,112,8,1,169,"0x127853950","0x0",879,112,8,1,170,"0x1278539c0","0x0",780,112,8,1,52,"0x127853a30","0x0",786,112,8,1,53,"0x127853aa0","0x0",980,112,8,1,6,"0x127853b10","0x0",961,112,8,1,171,"0x127853b80","0x0",802,112,8,1,6,"0x127853bf0","0x0",827,112,8,1,172,"0x127853c60","0x0",955,112,8,1,173,"0x127853cd0","0x0",958,112,8,1,173,"0x127853d40","0x0",2341,112,8,1,2,"0x127853db0","0x0",2326,112,8,1,2,"0x127853e20","0x0",1832,112,8,1,174,"0x127864000","0x0",2393,112,8,1,175,"0x1278640e0","0x0",2391,112,8,1,176,"0x127864150","0x0",330,112,8,1,177,"0x1278641c0","0x0",344,112,8,1,178,"0x127864380","0x0",2140,112,8,1,179,"0x127864460","0x0",2099,112,8,1,180,"0x1278644d0","0x0",2042,112,8,1,181,"0x127864620","0x0",1982,112,8,1,182,"0x1278647e0","0x0",1942,112,8,1,183,"0x127864850","0x0",2382,112,8,1,184,"0x127864bd0","0x0",2362,112,8,1,185,"0x127864c40","0x0",1319,112,8,1,135,"0x127864cb0","0x0",817,112,8,1,172,"0x127864d20","0x0",1492,112,8,1,6,"0x127864d90","0x0",1483,112,8,1,186,"0x127864e70","0x0",1505,112,8,1,186,"0x127864f50","0x0",1478,112,8,1,6,"0x127865110","0x0",1480,112,8,1,142,"0x1278661b0","0x0",1504,112,8,1,187,"0x127866220","0x0",1473,112,8,1,6,"0x127866290","0x0",580,160,51,1,0,"0x127880000","0x0",608,160,51,1,0,"0x1278800a0","0x0",558,160,51,1,0,"0x127880140","0x0",595,160,51,1,0,"0x1278801e0","0x0",905,160,51,1,0,"0x127880280","0x0",927,160,51,1,0,"0x127880320","0x0",951,160,51,1,0,"0x1278803c0","0x0",759,160,51,1,0,"0x127880460","0x0",746,160,51,1,0,"0x127880500","0x0",806,160,51,1,0,"0x1278805a0","0x0",1311,160,51,1,0,"0x127880640","0x0",1826,160,51,1,0,"0x1278806e0","0x0",1839,160,51,1,0,"0x127880780","0x0",1818,160,51,1,0,"0x127880820","0x0",1835,160,51,1,0,"0x1278808c0","0x0",2195,160,51,1,0,"0x127880960","0x0",1855,160,51,1,0,"0x127880a00","0x0",2027,160,51,1,0,"0x127880aa0","0x0",1843,160,51,1,0,"0x127880b40","0x0",1851,160,51,1,0,"0x127880be0","0x0",1847,160,51,1,0,"0x127880c80","0x0",2203,160,51,1,0,"0x127880d20","0x0",2193,160,51,1,0,"0x127880dc0","0x0",2190,160,51,1,0,"0x127880e60","0x0",2196,160,51,1,0,"0x127880f00","0x0",2160,160,51,1,0,"0x127880fa0","0x0",2090,160,51,1,0,"0x127881040","0x0",2082,160,51,1,0,"0x1278810e0","0x0",2163,160,51,1,0,"0x127881180","0x0",2138,160,51,1,0,"0x127881220","0x0",2112,160,51,1,0,"0x1278812c0","0x0",2208,160,51,1,0,"0x127881360","0x0",2060,160,51,1,0,"0x127881400","0x0",2180,160,51,1,0,"0x1278814a0","0x0",2183,160,51,1,0,"0x127881540","0x0",2125,160,51,1,0,"0x1278815e0","0x0",2127,160,51,1,0,"0x127881680","0x0",2121,160,51,1,0,"0x127881720","0x0",2114,160,51,1,0,"0x1278817c0","0x0",2131,160,51,1,0,"0x127881860","0x0",2148,160,51,1,0,"0x127881900","0x0",2149,160,51,1,0,"0x1278819a0","0x0",2111,160,51,1,0,"0x127881a40","0x0",2157,160,51,1,0,"0x127881ae0","0x0",2185,160,51,1,0,"0x127881b80","0x0",2173,160,51,1,0,"0x127881c20","0x0",2092,160,51,1,0,"0x127881cc0","0x0",2083,160,51,1,0,"0x127881d60","0x0",2143,160,51,1,0,"0x127881e00","0x0",2094,160,51,1,0,"0x127881ea0","0x0",2047,160,51,1,0,"0x127881f40","0x0",1987,160,51,1,0,"0x127881fe0","0x0",1934,160,51,1,0,"0x127882080","0x0",2003,160,51,1,0,"0x127882120","0x0",1981,160,51,1,0,"0x1278821c0","0x0",1946,160,51,1,0,"0x127882260","0x0",2097,160,51,1,0,"0x127882300","0x0",1945,160,51,1,0,"0x1278823a0","0x0",1950,160,51,1,0,"0x127882440","0x0",1957,160,51,1,0,"0x1278824e0","0x0",2068,160,51,1,0,"0x127882580","0x0",2063,160,51,1,0,"0x127882620","0x0",2062,160,51,1,0,"0x1278826c0","0x0",1983,160,51,1,0,"0x127882760","0x0",2022,160,51,1,0,"0x127882800","0x0",2051,160,51,1,0,"0x1278828a0","0x0",1999,160,51,1,0,"0x127882940","0x0",1967,160,51,1,0,"0x1278829e0","0x0",2036,160,51,1,0,"0x127882a80","0x0",2020,160,51,1,0,"0x127882b20","0x0",1990,160,51,1,0,"0x127882bc0","0x0",2019,160,51,1,0,"0x127882c60","0x0",2032,160,51,1,0,"0x127882d00","0x0",1968,160,51,1,0,"0x127882da0","0x0",2010,160,51,1,0,"0x127882e40","0x0",1996,160,51,1,0,"0x127882ee0","0x0",2040,160,51,1,0,"0x127882f80","0x0",2069,160,51,1,0,"0x127883020","0x0",1975,160,51,1,0,"0x1278830c0","0x0",2023,160,51,1,0,"0x127883160","0x0",1911,160,51,1,0,"0x127883200","0x0",1920,160,51,1,0,"0x1278832a0","0x0",1914,160,51,1,0,"0x127883340","0x0",1919,160,51,1,0,"0x1278833e0","0x0",1918,160,51,1,0,"0x127883480","0x0",1922,160,51,1,0,"0x127883520","0x0",1939,160,51,1,0,"0x1278835c0","0x0",1932,160,51,1,0,"0x127883660","0x0",1956,160,51,1,0,"0x127883700","0x0",1894,160,51,1,0,"0x1278837a0","0x0",1889,160,51,1,0,"0x127883840","0x0",1891,160,51,1,0,"0x1278838e0","0x0",1890,160,51,1,0,"0x127883980","0x0",1879,160,51,1,0,"0x127883a20","0x0",1892,160,51,1,0,"0x127883ac0","0x0",1872,160,51,1,0,"0x127883b60","0x0",1490,112,8,1,188,"0x127be2d10","0x0",1517,112,8,1,189,"0x127be2df0","0x0",346,112,8,1,190,"0x127be2f40","0x0",435,112,8,1,2,"0x127be35d0","0x0",439,112,8,1,2,"0x127be3a30","0x0",1525,112,8,1,191,"0x127be3aa0","0x0",1521,112,8,1,192,"0x127be3e20","0x0",2129,32,46,1,0,"0x12813a980","0x0",2089,32,46,1,0,"0x12813b4e0","0x0",2024,32,46,1,0,"0x12813b640","0x0",1965,32,46,1,0,"0x12813b780","0x0",1931,32,46,1,0,"0x12813b7a0","0x0",1868,32,46,1,0,"0x12813ba40","0x0",1831,176,45,1,0,"0x1281c8dc0","0x0",1813,176,45,1,0,"0x1281c8f20","0x0",1837,176,45,1,0,"0x1281c8fd0","0x0",1824,176,45,1,0,"0x1281c9130","0x0",1284,176,45,1,0,"0x1281c91e0","0x0",797,176,45,1,0,"0x1281c9290","0x0",738,176,45,1,0,"0x1281c9340","0x0",752,176,45,1,0,"0x1281c93f0","0x0",945,176,45,1,0,"0x1281c94a0","0x0",921,176,45,1,0,"0x1281c9550","0x0",901,176,45,1,0,"0x1281c9600","0x0",584,176,45,1,0,"0x1281c96b0","0x0",550,176,45,1,0,"0x1281c9760","0x0",604,176,45,1,0,"0x1281c9810","0x0",2152,176,45,1,0,"0x1282a1ce0","0x0",2101,176,45,1,0,"0x1282a1d90","0x0",2145,176,45,1,0,"0x1282a1e40","0x0",2142,176,45,1,0,"0x1282a1ef0","0x0",2120,176,45,1,0,"0x1282a1fa0","0x0",2104,176,45,1,0,"0x1282a2050","0x0",2115,176,45,1,0,"0x1282a2100","0x0",2119,176,45,1,0,"0x1282a25d0","0x0",2113,176,45,1,0,"0x1282a2680","0x0",2170,176,45,1,0,"0x1282a2730","0x0",2169,176,45,1,0,"0x1282a27e0","0x0",2052,176,45,1,0,"0x1282a2890","0x0",2201,176,45,1,0,"0x1282a2940","0x0",2107,176,45,1,0,"0x1282a29f0","0x0",2132,176,45,1,0,"0x1282a2aa0","0x0",2156,176,45,1,0,"0x1282a2b50","0x0",2078,176,45,1,0,"0x1282a2c00","0x0",2080,176,45,1,0,"0x1282a2cb0","0x0",2147,176,45,1,0,"0x1282a34f0","0x0",2189,176,45,1,0,"0x1282a3700","0x0",2184,176,45,1,0,"0x1282a37b0","0x0",2176,176,45,1,0,"0x1282a3910","0x0",2198,176,45,1,0,"0x1282a39c0","0x0",1845,176,45,1,0,"0x1282a3a70","0x0",1849,176,45,1,0,"0x1282a3b20","0x0",1841,176,45,1,0,"0x1282a3bd0","0x0",2206,176,45,1,0,"0x1282a3c80","0x0",1853,176,45,1,0,"0x1282a3d30","0x0",1857,176,45,1,0,"0x1282a3de0","0x0",1902,176,45,1,0,"0x128334000","0x0",2011,176,45,1,0,"0x128334630","0x0",1970,176,45,1,0,"0x1283346e0","0x0",2066,176,45,1,0,"0x128334790","0x0",2034,176,45,1,0,"0x128334840","0x0",1988,176,45,1,0,"0x1283349a0","0x0",2004,176,45,1,0,"0x128334b00","0x0",1962,176,45,1,0,"0x128334bb0","0x0",2026,176,45,1,0,"0x128334c60","0x0",2014,176,45,1,0,"0x128334d10","0x0",1985,176,45,1,0,"0x128334dc0","0x0",2007,176,45,1,0,"0x128334e70","0x0",2025,176,45,1,0,"0x128335130","0x0",1960,176,45,1,0,"0x1283351e0","0x0",1992,176,45,1,0,"0x128335290","0x0",2049,176,45,1,0,"0x128335340","0x0",2015,176,45,1,0,"0x1283353f0","0x0",1978,176,45,1,0,"0x1283354a0","0x0",2057,176,45,1,0,"0x128335550","0x0",2056,176,45,1,0,"0x128335600","0x0",2064,176,45,1,0,"0x1283356b0","0x0",1953,176,45,1,0,"0x128335760","0x0",1947,176,45,1,0,"0x128335810","0x0",1936,176,45,1,0,"0x1283358c0","0x0",2093,176,45,1,0,"0x128335970","0x0",1941,176,45,1,0,"0x128335a20","0x0",1972,176,45,1,0,"0x128335ad0","0x0",1998,176,45,1,0,"0x128335b80","0x0",2044,176,45,1,0,"0x128335e40","0x0",1974,176,45,1,0,"0x128335ef0","0x0",2039,176,45,1,0,"0x128335fa0","0x0",2085,176,45,1,0,"0x128336050","0x0",2137,176,45,1,0,"0x128336cb0","0x0",2075,176,45,1,0,"0x128336e10","0x0",2084,176,45,1,0,"0x128337020","0x0",2167,176,45,1,0,"0x1283370d0","0x0",2172,176,45,1,0,"0x128337230","0x0",913,112,8,1,6,"0x12833c070","0x0",918,112,8,1,6,"0x12833c0e0","0x0",900,112,8,1,6,"0x12833c460","0x0",910,112,8,1,6,"0x12833c4d0","0x0",336,112,8,1,6,"0x12833c540","0x0",337,112,8,1,6,"0x12833c5b0","0x0",1091,112,8,1,193,"0x12833c690","0x0",1093,112,8,1,6,"0x12833c700","0x0",1089,112,8,1,6,"0x12833c770","0x0",1096,112,8,1,6,"0x12833c7e0","0x0",890,112,8,1,194,"0x12833c850","0x0",1087,112,8,1,195,"0x12833c8c0","0x0",2315,68,6,0,0,"0x12f02be00","0x0",2397,64,56,1,0,"0x12f106900","0x0",438,48,57,1,0,"0x12f144c60","0x0",437,48,57,1,0,"0x12f144c90","0x0",436,48,57,1,0,"0x12f144cc0","0x0",434,48,57,1,0,"0x12f144cf0","0x0",433,48,57,1,0,"0x12f144d20","0x0",432,48,57,1,0,"0x12f144d50","0x0",431,48,57,1,0,"0x12f144d80","0x0",430,48,57,1,0,"0x12f144db0","0x0",428,48,57,1,0,"0x12f144de0","0x0",427,48,57,1,0,"0x12f144e10","0x0",415,48,57,1,0,"0x12f144e40","0x0",413,48,57,1,0,"0x12f144e70","0x0",411,48,57,1,0,"0x12f144ea0","0x0",409,48,57,1,0,"0x12f144ed0","0x0",407,48,57,1,0,"0x12f144f00","0x0",405,48,57,1,0,"0x12f144f30","0x0",403,48,57,1,0,"0x12f144f60","0x0",401,48,57,1,0,"0x12f144f90","0x0",399,48,57,1,0,"0x12f144fc0","0x0",397,48,57,1,0,"0x12f144ff0","0x0",396,48,57,1,0,"0x12f145020","0x0",394,48,57,1,0,"0x12f145050","0x0",392,48,57,1,0,"0x12f145080","0x0",390,48,57,1,0,"0x12f1450b0","0x0",388,48,57,1,0,"0x12f1450e0","0x0",386,48,57,1,0,"0x12f145110","0x0",384,48,57,1,0,"0x12f145140","0x0",382,48,57,1,0,"0x12f145170","0x0",483,48,57,1,0,"0x12f1451a0","0x0",481,48,57,1,0,"0x12f1451d0","0x0",479,48,57,1,0,"0x12f145200","0x0",477,48,57,1,0,"0x12f145230","0x0",475,48,57,1,0,"0x12f145260","0x0",473,48,57,1,0,"0x12f145290","0x0",471,48,57,1,0,"0x12f1452c0","0x0",469,48,57,1,0,"0x12f1452f0","0x0",467,48,57,1,0,"0x12f145320","0x0",465,48,57,1,0,"0x12f145350","0x0",463,48,57,1,0,"0x12f145380","0x0",461,48,57,1,0,"0x12f1453b0","0x0",459,48,57,1,0,"0x12f1453e0","0x0",457,48,57,1,0,"0x12f145410","0x0",455,48,57,1,0,"0x12f145440","0x0",453,48,57,1,0,"0x12f145470","0x0",451,48,57,1,0,"0x12f1454a0","0x0",449,48,57,1,0,"0x12f1454d0","0x0",447,48,57,1,0,"0x12f145500","0x0",445,48,57,1,0,"0x12f145530","0x0",443,48,57,1,0,"0x12f145560","0x0",441,48,57,1,0,"0x12f145590","0x0",426,48,57,1,0,"0x12f1455f0","0x0",424,48,57,1,0,"0x12f145620","0x0",422,48,57,1,0,"0x12f145650","0x0",421,48,57,1,0,"0x12f145680","0x0",420,48,57,1,0,"0x12f1456b0","0x0",419,48,57,1,0,"0x12f1456e0","0x0",418,48,57,1,0,"0x12f145710","0x0",417,48,57,1,0,"0x12f145740","0x0",416,48,57,1,0,"0x12f145770","0x0",414,48,57,1,0,"0x12f1457a0","0x0",412,48,57,1,0,"0x12f1457d0","0x0",410,48,57,1,0,"0x12f145800","0x0",408,48,57,1,0,"0x12f145830","0x0",406,48,57,1,0,"0x12f145860","0x0",404,48,57,1,0,"0x12f145890","0x0",402,48,57,1,0,"0x12f1458c0","0x0",400,48,57,1,0,"0x12f1458f0","0x0",398,48,57,1,0,"0x12f145920","0x0",395,48,57,1,0,"0x12f145950","0x0",393,48,57,1,0,"0x12f145980","0x0",391,48,57,1,0,"0x12f1459b0","0x0",389,48,57,1,0,"0x12f1459e0","0x0",387,48,57,1,0,"0x12f145a10","0x0",385,48,57,1,0,"0x12f145a40","0x0",383,48,57,1,0,"0x12f145a70","0x0",381,48,57,1,0,"0x12f145aa0","0x0",380,48,57,1,0,"0x12f145ad0","0x0",379,48,57,1,0,"0x12f145b00","0x0",377,48,57,1,0,"0x12f145b30","0x0",376,48,57,1,0,"0x12f145b60","0x0",375,48,57,1,0,"0x12f145b90","0x0",374,48,57,1,0,"0x12f145bc0","0x0",373,48,57,1,0,"0x12f145bf0","0x0",372,48,57,1,0,"0x12f145c20","0x0",371,48,57,1,0,"0x12f145c50","0x0",370,48,57,1,0,"0x12f145c80","0x0",369,48,57,1,0,"0x12f145cb0","0x0",368,48,57,1,0,"0x12f145ce0","0x0",367,48,57,1,0,"0x12f145d10","0x0",366,48,57,1,0,"0x12f145d40","0x0",365,48,57,1,0,"0x12f145d70","0x0",364,48,57,1,0,"0x12f145da0","0x0",363,48,57,1,0,"0x12f145dd0","0x0",362,48,57,1,0,"0x12f145e00","0x0",361,48,57,1,0,"0x12f145e30","0x0",360,48,57,1,0,"0x12f145e60","0x0",359,48,57,1,0,"0x12f145e90","0x0",358,48,57,1,0,"0x12f145ec0","0x0",357,48,57,1,0,"0x12f145ef0","0x0",356,48,57,1,0,"0x12f145f20","0x0",355,48,57,1,0,"0x12f145f50","0x0",354,48,57,1,0,"0x12f145f80","0x0",353,48,57,1,0,"0x12f145fb0","0x0",352,48,57,1,0,"0x12f145fe0","0x0",351,48,57,1,0,"0x12f146010","0x0",350,48,57,1,0,"0x12f146040","0x0",349,48,57,1,0,"0x12f146070","0x0",1610,48,57,1,0,"0x12f1460a0","0x0",1609,48,57,1,0,"0x12f1460d0","0x0",1596,48,57,1,0,"0x12f146100","0x0",1593,48,57,1,0,"0x12f146130","0x0",1589,48,57,1,0,"0x12f146160","0x0",1587,48,57,1,0,"0x12f146190","0x0",1585,48,57,1,0,"0x12f1461c0","0x0",1583,48,57,1,0,"0x12f1461f0","0x0",1581,48,57,1,0,"0x12f146220","0x0",1577,48,57,1,0,"0x12f146250","0x0",1573,48,57,1,0,"0x12f146280","0x0",1570,48,57,1,0,"0x12f1462b0","0x0",1568,48,57,1,0,"0x12f1462e0","0x0",1566,48,57,1,0,"0x12f146310","0x0",944,48,10,1,0,"0x12f146340","0x0",949,48,10,1,0,"0x12f146490","0x0",2232,67,6,0,0,"0x13f807c40","0x0",2221,67,6,0,0,"0x13f807c80","0x0",2257,70,6,0,0,"0x143007e00","0x0",1108,67,6,0,0,"0x14300fe00","0x0",1021,67,6,0,0,"0x143017e00","0x0",429,64,31,0,0,"0x144aea640","0x0",936,232,39,0,0,"0x144aea680","0x0",1779,66,31,0,0,"0x144aea6c0","0x0",495,48,57,1,0,"0x144d08270","0x0",494,48,57,1,0,"0x144d082a0","0x0",493,48,57,1,0,"0x144d082d0","0x0",492,48,57,1,0,"0x144d08300","0x0",491,48,57,1,0,"0x144d08330","0x0",490,48,57,1,0,"0x144d08360","0x0",489,48,57,1,0,"0x144d08390","0x0",488,48,57,1,0,"0x144d083c0","0x0",487,48,57,1,0,"0x144d083f0","0x0",486,48,57,1,0,"0x144d08420","0x0",485,48,57,1,0,"0x144d08450","0x0",484,48,57,1,0,"0x144d08480","0x0",482,48,57,1,0,"0x144d084b0","0x0",480,48,57,1,0,"0x144d084e0","0x0",478,48,57,1,0,"0x144d08510","0x0",476,48,57,1,0,"0x144d08540","0x0",474,48,57,1,0,"0x144d08570","0x0",472,48,57,1,0,"0x144d085a0","0x0",470,48,57,1,0,"0x144d085d0","0x0",468,48,57,1,0,"0x144d08600","0x0",466,48,57,1,0,"0x144d08630","0x0",464,48,57,1,0,"0x144d08660","0x0",462,48,57,1,0,"0x144d08690","0x0",460,48,57,1,0,"0x144d086c0","0x0",458,48,57,1,0,"0x144d0a190","0x0",456,48,57,1,0,"0x144d0a1c0","0x0",454,48,57,1,0,"0x144d0a1f0","0x0",452,48,57,1,0,"0x144d0a220","0x0",450,48,57,1,0,"0x144d0a250","0x0",448,48,57,1,0,"0x144d0a280","0x0",446,48,57,1,0,"0x144d0a2b0","0x0",444,48,57,1,0,"0x144d0a2e0","0x0",442,48,57,1,0,"0x144d0a310","0x0",440,48,57,1,0,"0x144d0bd50","0x0",2141,48,6,0,196,"0x144d38000","0x0",2096,48,6,0,197,"0x144d38030","0x0",2133,48,6,0,198,"0x144d38060","0x0",2128,48,6,0,199,"0x144d38090","0x0",2109,48,6,0,200,"0x144d380c0","0x0",2098,48,6,0,201,"0x144d380f0","0x0",2103,48,6,0,202,"0x144d38120","0x0",2110,48,6,0,203,"0x144d38150","0x0",2100,48,6,0,204,"0x144d38180","0x0",2165,48,6,0,205,"0x144d38210","0x0",2161,48,6,0,206,"0x144d38240","0x0",2048,48,6,0,207,"0x144d38270","0x0",2192,48,6,0,208,"0x144d382a0","0x0",2091,48,6,0,209,"0x144d382d0","0x0",2130,48,6,0,210,"0x144d38300","0x0",2135,48,6,0,211,"0x144d385a0","0x0",2073,48,6,0,212,"0x144d385d0","0x0",2070,48,6,0,213,"0x144d38600","0x0",2136,48,6,0,214,"0x144d38630","0x0",2179,48,6,0,215,"0x144d386c0","0x0",2175,48,6,0,216,"0x144d386f0","0x0",2155,48,6,0,217,"0x144d38720","0x0",2188,48,6,0,218,"0x144d38750","0x0",1844,48,6,0,219,"0x144d38780","0x0",1848,48,6,0,220,"0x144d387b0","0x0",1840,48,6,0,221,"0x144d387e0","0x0",2199,48,6,0,222,"0x144d38810","0x0",1852,48,6,0,223,"0x144d38840","0x0",1856,48,6,0,224,"0x144d38870","0x0",1830,48,6,0,225,"0x144d388a0","0x0",1810,48,6,0,226,"0x144d388d0","0x0",1836,48,6,0,227,"0x144d38900","0x0",1821,48,6,0,228,"0x144d38930","0x0",1272,48,6,0,229,"0x144d38960","0x0",784,48,6,0,229,"0x144d38990","0x0",1804,49,6,0,0,"0x144d38ab0","0x0",1733,49,6,0,0,"0x144d38ae0","0x0",1720,49,6,0,0,"0x144d38b10","0x0",1704,49,6,0,0,"0x144d38b40","0x0",1680,49,6,0,0,"0x144d38b70","0x0",1668,49,6,0,0,"0x144d38ba0","0x0",1649,49,6,0,0,"0x144d38bd0","0x0",1574,49,6,0,0,"0x144d38c00","0x0",1559,49,6,0,0,"0x144d38c30","0x0",1542,49,6,0,0,"0x144d38c90","0x0",1527,49,6,0,0,"0x144d38cc0","0x0",1278,49,6,0,0,"0x144d38cf0","0x0",850,49,6,0,0,"0x144d38d20","0x0",748,49,6,0,0,"0x144d38e10","0x0",547,49,6,0,0,"0x144d38e40","0x0",731,48,6,0,229,"0x144d38e70","0x0",741,48,6,0,229,"0x144d38ea0","0x0",934,48,6,0,230,"0x144d38ed0","0x0",914,48,6,0,231,"0x144d38f00","0x0",893,48,6,0,229,"0x144d38f30","0x0",564,48,6,0,232,"0x144d38f60","0x0",540,48,6,0,233,"0x144d38f90","0x0",600,48,6,0,234,"0x144d38fc0","0x0",546,48,6,0,235,"0x144d38ff0","0x0",578,48,6,0,236,"0x144d39020","0x0",548,48,6,0,237,"0x144d39050","0x0",583,48,6,0,238,"0x144d39080","0x0",555,48,6,0,239,"0x144d390b0","0x0",579,48,6,0,240,"0x144d39530","0x0",557,48,6,0,241,"0x144d39560","0x0",589,48,6,0,242,"0x144d39590","0x0",559,48,6,0,243,"0x144d395c0","0x0",601,48,6,0,244,"0x144d39650","0x0",566,48,6,0,245,"0x144d396b0","0x0",633,48,6,0,246,"0x144d396e0","0x0",611,48,6,0,247,"0x144d39710","0x0",639,48,6,0,248,"0x144d39740","0x0",609,48,6,0,129,"0x144d39770","0x0",638,48,6,0,249,"0x144d397a0","0x0",607,48,6,0,250,"0x144d39800","0x0",652,48,6,0,251,"0x144d39830","0x0",610,48,6,0,252,"0x144d39860","0x0",642,48,6,0,253,"0x144d39890","0x0",612,48,6,0,254,"0x144d398c0","0x0",657,48,6,0,255,"0x144d398f0","0x0",619,48,6,0,256,"0x144d39920","0x0",666,48,6,0,257,"0x144d39950","0x0",641,48,6,0,258,"0x144d39980","0x0",695,48,6,0,259,"0x144d39a70","0x0",669,48,6,0,260,"0x144d39aa0","0x0",689,48,6,0,261,"0x144d39ad0","0x0",662,48,6,0,262,"0x144d39b00","0x0",704,48,6,0,263,"0x144d39c50","0x0",675,48,6,0,264,"0x144d39c80","0x0",716,48,6,0,265,"0x144d39cb0","0x0",683,48,6,0,266,"0x144d39dd0","0x0",734,48,6,0,267,"0x144d39e00","0x0",693,48,6,0,268,"0x144d39e30","0x0",823,48,6,0,269,"0x144d39e60","0x0",690,49,6,0,270,"0x144d39e90","0x0",812,48,6,0,271,"0x144d39ec0","0x0",702,49,6,0,272,"0x144d39ef0","0x0",712,48,6,0,273,"0x144d39f20","0x0",723,48,6,0,274,"0x144d39f50","0x0",749,49,6,0,275,"0x144d39f80","0x0",742,48,6,0,276,"0x144d39fb0","0x0",750,48,6,0,277,"0x144d39fe0","0x0",751,48,6,0,278,"0x144d3a010","0x0",758,48,6,0,279,"0x144d3a040","0x0",775,48,6,0,280,"0x144d3a070","0x0",785,48,6,0,281,"0x144d3a0a0","0x0",781,48,6,0,282,"0x144d3a0d0","0x0",787,48,6,0,283,"0x144d3a130","0x0",818,48,6,0,284,"0x144d3a160","0x0",808,48,6,0,285,"0x144d3a190","0x0",819,48,6,0,286,"0x144d3a1c0","0x0",815,48,6,0,287,"0x144d3a1f0","0x0",821,48,6,0,288,"0x144d3a220","0x0",833,48,6,0,289,"0x144d3a250","0x0",846,48,6,0,290,"0x144d3a280","0x0",849,48,6,0,291,"0x144d3a2b0","0x0",852,48,6,0,292,"0x144d3a2e0","0x0",855,48,6,0,293,"0x144d3a310","0x0",866,48,6,0,294,"0x144d3a340","0x0",870,49,6,0,295,"0x144d3a370","0x0",1798,49,6,0,0,"0x144d3a3d0","0x0",1794,49,6,0,0,"0x144d3a400","0x0",1787,49,6,0,0,"0x144d3a430","0x0",1780,49,6,0,0,"0x144d3a460","0x0",1776,49,6,0,0,"0x144d3a490","0x0",1765,49,6,0,0,"0x144d3a4c0","0x0",1747,49,6,0,0,"0x144d3a4f0","0x0",839,49,6,0,0,"0x144d3a520","0x0",820,49,6,0,0,"0x144d3a550","0x0",799,49,6,0,0,"0x144d3a580","0x0",810,49,6,0,0,"0x144d3a5b0","0x0",907,49,6,0,0,"0x144d3a5e0","0x0",896,49,6,0,0,"0x144d3a610","0x0",614,49,6,0,0,"0x144d3a640","0x0",594,49,6,0,0,"0x144d3a6a0","0x0",563,49,6,0,0,"0x144d3a820","0x0",552,49,6,0,0,"0x144d3a850","0x0",544,49,6,0,0,"0x144d3a880","0x0",532,49,6,0,0,"0x144d3a8b0","0x0",539,49,6,0,0,"0x144d3a8e0","0x0",534,49,6,0,0,"0x144d3a910","0x0",537,49,6,0,0,"0x144d3a940","0x0",551,49,6,0,0,"0x144d3a970","0x0",541,49,6,0,0,"0x144d3a9d0","0x0",694,49,6,0,0,"0x144d3aa00","0x0",674,49,6,0,0,"0x144d3aa30","0x0",659,49,6,0,0,"0x144d3aa60","0x0",645,50,6,0,0,"0x144d3aac0","0x0",636,50,6,0,0,"0x144d3abb0","0x0",2321,50,6,0,64,"0x144d3abe0","0x0",2302,50,6,0,64,"0x144d3ac10","0x0",2310,50,6,0,296,"0x144d3ac40","0x0",1055,50,6,0,297,"0x144d3ac70","0x0",1134,50,6,0,297,"0x144d3aca0","0x0",2299,50,6,0,298,"0x144d3acd0","0x0",2353,48,6,0,299,"0x144d3ad00","0x0",2328,48,6,0,300,"0x144d3ad30","0x0",2363,50,6,0,301,"0x144d3ad60","0x0",2356,50,6,0,64,"0x144d3ad90","0x0",2259,50,6,0,302,"0x144d3adc0","0x0",768,48,6,0,303,"0x144d3ae20","0x0",891,49,6,0,0,"0x144d3ae50","0x0",2248,50,6,0,64,"0x144d3ae80","0x0",2245,50,6,0,64,"0x144d3aeb0","0x0",2242,50,6,0,64,"0x144d3b120","0x0",2239,50,6,0,64,"0x144d3b150","0x0",1223,48,6,0,304,"0x144d3b180","0x0",1385,50,6,0,305,"0x144d3b360","0x0",1336,48,6,0,118,"0x144d3b390","0x0",1309,50,6,0,64,"0x144d3b3c0","0x0",1298,50,6,0,64,"0x144d3b3f0","0x0",1283,50,6,0,306,"0x144d3b420","0x0",1258,50,6,0,307,"0x144d3b480","0x0",1238,50,6,0,308,"0x144d3b4b0","0x0",1215,50,6,0,309,"0x144d3b4e0","0x0",1432,50,6,0,305,"0x144d3b540","0x0",1376,48,6,0,97,"0x144d3b570","0x0",1338,50,6,0,64,"0x144d3b5a0","0x0",1314,50,6,0,64,"0x144d3b5d0","0x0",1299,50,6,0,310,"0x144d3b600","0x0",1273,50,6,0,306,"0x144d3b630","0x0",1252,50,6,0,311,"0x144d3b660","0x0",1229,50,6,0,307,"0x144d3b690","0x0",1209,50,6,0,308,"0x144d3b6c0","0x0",1147,48,6,0,117,"0x144d3b6f0","0x0",925,50,6,0,71,"0x144d3bbd0","0x0",1161,50,6,0,312,"0x144d3bc00","0x0",1698,50,6,0,73,"0x144d3bc30","0x0",1661,50,6,0,313,"0x144d3bc60","0x0",1640,50,6,0,314,"0x144d3bcf0","0x0",1627,50,6,0,64,"0x144d3bd20","0x0",1601,50,6,0,315,"0x144d3bd50","0x0",1571,50,6,0,93,"0x144d3bdb0","0x0",1557,50,6,0,316,"0x144d3bde0","0x0",1528,50,6,0,317,"0x144d3be10","0x0",1515,50,6,0,318,"0x144d3be40","0x0",1496,50,6,0,319,"0x144d3be70","0x0",1522,50,6,0,320,"0x144d69a10","0x0",1531,50,6,0,321,"0x144d69a40","0x0",1543,50,6,0,322,"0x144d69b90","0x0",1549,50,6,0,323,"0x144d69ce0","0x0",1545,50,6,0,324,"0x144d69d10","0x0",1553,50,6,0,325,"0x144d69d40","0x0",1569,50,6,0,326,"0x144d69d70","0x0",1572,50,6,0,327,"0x144d69dd0","0x0",1597,50,6,0,328,"0x144d69e00","0x0",1588,50,6,0,308,"0x144d69e30","0x0",1604,50,6,0,329,"0x144d69e60","0x0",1592,50,6,0,330,"0x144d69e90","0x0",1618,50,6,0,331,"0x144d69ec0","0x0",1614,50,6,0,332,"0x144d69f20","0x0",1612,50,6,0,333,"0x144d69f80","0x0",1626,50,6,0,334,"0x144d69fb0","0x0",1637,50,6,0,335,"0x144d6a070","0x0",1641,50,6,0,336,"0x144d6a160","0x0",1643,50,6,0,337,"0x144d6a190","0x0",1652,50,6,0,338,"0x144d6a2b0","0x0",1659,50,6,0,339,"0x144d6a370","0x0",1663,50,6,0,340,"0x144d6a850","0x0",1658,50,6,0,341,"0x144d6a880","0x0",1671,50,6,0,342,"0x144d6a8b0","0x0",1681,50,6,0,343,"0x144d6a8e0","0x0",1694,50,6,0,344,"0x144d6a910","0x0",1682,50,6,0,345,"0x144d6a940","0x0",1689,50,6,0,346,"0x144d6a970","0x0",1705,50,6,0,347,"0x144d6a9a0","0x0",1709,50,6,0,348,"0x144d6a9d0","0x0",1713,50,6,0,349,"0x144d6aa30","0x0",1714,50,6,0,350,"0x144d6aa60","0x0",1734,50,6,0,351,"0x144d6aa90","0x0",1735,50,6,0,352,"0x144d6aac0","0x0",1743,50,6,0,353,"0x144d6aaf0","0x0",1740,50,6,0,354,"0x144d6ab50","0x0",1745,50,6,0,355,"0x144d6ab80","0x0",1751,50,6,0,356,"0x144d6abb0","0x0",1764,50,6,0,357,"0x144d6abe0","0x0",1761,50,6,0,358,"0x144d6ac10","0x0",529,50,6,0,359,"0x144d6ac40","0x0",526,50,6,0,360,"0x144d6ac70","0x0",523,50,6,0,361,"0x144d6aca0","0x0",520,50,6,0,362,"0x144d6acd0","0x0",517,50,6,0,363,"0x144d6ad00","0x0",514,50,6,0,364,"0x144d6ad30","0x0",511,50,6,0,365,"0x144d6ad60","0x0",508,50,6,0,366,"0x144d6ad90","0x0",505,50,6,0,367,"0x144d6adf0","0x0",502,50,6,0,368,"0x144d6ae20","0x0",499,50,6,0,369,"0x144d6ae50","0x0",496,50,6,0,370,"0x144d6ae80","0x0",1827,50,6,0,371,"0x144d6aeb0","0x0",1820,50,6,0,372,"0x144d6aee0","0x0",1811,50,6,0,373,"0x144d6af10","0x0",1805,50,6,0,374,"0x144d6af40","0x0",1797,50,6,0,375,"0x144d6af70","0x0",1790,50,6,0,376,"0x144d6afa0","0x0",1781,50,6,0,377,"0x144d6afd0","0x0",1771,50,6,0,378,"0x144d6b030","0x0",1748,50,6,0,379,"0x144d6b060","0x0",1729,50,6,0,380,"0x144d6b090","0x0",1703,50,6,0,381,"0x144d6b0c0","0x0",1685,50,6,0,382,"0x144d6b0f0","0x0",1656,50,6,0,315,"0x144d6b120","0x0",1634,50,6,0,383,"0x144d6b150","0x0",1616,50,6,0,384,"0x144d6b180","0x0",341,50,6,0,385,"0x144d6b1b0","0x0",338,50,6,0,386,"0x144d6b1e0","0x0",333,50,6,0,387,"0x144d6b210","0x0",2348,50,6,0,388,"0x144d6b240","0x0",2330,50,6,0,389,"0x144d6b270","0x0",2159,49,6,0,0,"0x144d6b2a0","0x0",2151,49,6,0,0,"0x144d6b2d0","0x0",1895,49,6,0,0,"0x144d6b300","0x0",1880,49,6,0,0,"0x144d6b360","0x0",1869,49,6,0,0,"0x144d6b390","0x0",1862,49,6,0,0,"0x144d6b3c0","0x0",1858,49,6,0,0,"0x144d6b3f0","0x0",2118,48,6,0,224,"0x144d6b420","0x0",2071,48,6,0,390,"0x144d6b450","0x0",2008,48,6,0,222,"0x144d6b480","0x0",1952,48,6,0,223,"0x144d6b4b0","0x0",1917,48,6,0,391,"0x144d6b4e0","0x0",1861,48,6,0,392,"0x144d6b510","0x0",1876,48,6,0,393,"0x144d6b540","0x0",1860,48,6,0,394,"0x144d6b570","0x0",1874,48,6,0,395,"0x144d6b5a0","0x0",1866,48,6,0,396,"0x144d6b5d0","0x0",1864,48,6,0,397,"0x144d6b600","0x0",1865,48,6,0,398,"0x144d6b630","0x0",1916,48,6,0,399,"0x144d6b660","0x0",1923,48,6,0,400,"0x144d6b690","0x0",1925,48,6,0,401,"0x144d6b6c0","0x0",1899,48,6,0,402,"0x144d6b6f0","0x0",1893,48,6,0,403,"0x144d6b720","0x0",1900,48,6,0,404,"0x144d6b750","0x0",1898,48,6,0,405,"0x144d6b780","0x0",1897,48,6,0,406,"0x144d6b7b0","0x0",1896,48,6,0,407,"0x144d6b7e0","0x0",2001,48,6,0,408,"0x144d6b810","0x0",1958,48,6,0,409,"0x144d6b840","0x0",2038,48,6,0,410,"0x144d6b870","0x0",2029,48,6,0,411,"0x144d6b8a0","0x0",1979,48,6,0,412,"0x144d6b8d0","0x0",1995,48,6,0,413,"0x144d6b900","0x0",1955,48,6,0,414,"0x144d6b930","0x0",2017,48,6,0,415,"0x144d6b960","0x0",1997,48,6,0,416,"0x144d6b990","0x0",1977,48,6,0,417,"0x144d6b9c0","0x0",2002,48,6,0,418,"0x144d6b9f0","0x0",2012,48,6,0,419,"0x144d6ba20","0x0",1951,48,6,0,420,"0x144d6ba50","0x0",1984,48,6,0,421,"0x144d6ba80","0x0",2037,48,6,0,422,"0x144d6bab0","0x0",2006,48,6,0,423,"0x144d6bae0","0x0",1969,48,6,0,424,"0x144d6bb10","0x0",2045,48,6,0,425,"0x144d6bb40","0x0",2043,48,6,0,426,"0x144d6bb70","0x0",2054,48,6,0,427,"0x144d6bba0","0x0",1944,48,6,0,428,"0x144d6bbd0","0x0",1940,48,6,0,429,"0x144d6bc00","0x0",1924,48,6,0,430,"0x144d6bc30","0x0",2055,48,6,0,431,"0x144d6bc60","0x0",1930,48,6,0,432,"0x144d6bc90","0x0",1966,48,6,0,433,"0x144d6bcc0","0x0",1991,48,6,0,434,"0x144d6bcf0","0x0",2033,48,6,0,391,"0x144d6bd20","0x0",1959,48,6,0,435,"0x144d6bd50","0x0",2031,48,6,0,390,"0x144d6bd80","0x0",2077,48,6,0,436,"0x144d6bdb0","0x0",2123,48,6,0,437,"0x144d6bde0","0x0",2072,48,6,0,438,"0x144d6be10","0x0",2074,48,6,0,439,"0x144d6be40","0x0",2164,48,6,0,440,"0x144d6be70","0x0",2166,48,6,0,441,"0x144d6bea0","0x0",2387,32,58,0,0,"0x1505a2420","0x0",2106,32,59,0,0,"0x1505a2440","0x0",2059,32,60,0,0,"0x1505a2460","0x0",1994,32,61,0,0,"0x1505a2480","0x0",1948,32,62,0,0,"0x1505a24c0","0x0",1909,32,63,0,0,"0x1505a2500","0x0",1184,33,64,0,0,"0x1505a2540","0x0",1136,35,65,0,0,"0x1505a2560","0x0",1151,62,66,0,0,"0x1505a2580","0x0"],"nodeClassNames":["<root>","RegExp","Window","StructureRareData","JSWindowProxy","symbol","Function","NativeExecutable","Structure","HTMLDocument","HashMapBucket","CustomGetterSetter","string","HTMLDocumentPrototype","DocumentPrototype","NodePrototype","EventTargetPrototype","WebAssembly.Table","WebAssembly.RuntimeError","WebAssembly.Module","WebAssembly.Memory","WebAssembly.LinkError","WebAssembly.Instance","WebAssembly.CompileError","WebAssembly","InspectorInstrumentation","Set Iterator","Map Iterator","AsyncFromSyncIterator","Array Iterator","ModuleLoader","Object","AsyncGenerator","AsyncFunction","GeneratorFunction","String Iterator","InternalPromisePrototype","PromisePrototype","Set","Map","Symbol","Generator","AsyncIterator","Iterator","WindowPrototype","FunctionExecutable","InferredValue","JSGlobalLexicalEnvironment","AsyncGeneratorFunction","PropertyTable","SymbolTable","UnlinkedFunctionExecutable","GetterSetter","ArrayBufferPrototype","Array","Callee","JSPropertyNameEnumerator","DOMAttributeGetterSetter","WindowProperties","ReadableStreamBYOBReaderPrivateConstructor","ReadableStreamDefaultReaderPrivateConstructor","ReadableStreamBYOBRequestPrivateConstructor","ReadableByteStreamControllerPrivateConstructor","ReadableStreamDefaultControllerPrivateConstructor","Boolean","Number","String"],"edges":[0,328,0,0,0,2397,0,0,0,327,0,0,0,326,0,0,0,325,0,0,0,324,0,0,0,323,0,0,0,2396,0,0,0,322,0,0,0,321,0,0,0,320,0,0,0,56,0,0,0,319,0,0,0,318,0,0,0,317,0,0,0,316,0,0,0,315,0,0,0,55,0,0,0,314,0,0,0,313,0,0,0,312,0,0,0,54,0,0,0,311,0,0,0,310,0,0,0,309,0,0,0,53,0,0,0,308,0,0,0,54,0,0,0,307,0,0,0,306,0,0,0,55,0,0,0,305,0,0,0,52,0,0,0,304,0,0,0,303,0,0,0,51,0,0,0,302,0,0,0,50,0,0,0,49,0,0,0,48,0,0,0,47,0,0,0,301,0,0,0,46,0,0,0,300,0,0,0,45,0,0,0,299,0,0,0,44,0,0,0,298,0,0,0,43,0,0,0,297,0,0,0,42,0,0,0,296,0,0,0,41,0,0,0,295,0,0,0,40,0,0,0,294,0,0,0,39,0,0,0,293,0,0,0,38,0,0,0,37,0,0,0,292,0,0,0,36,0,0,0,291,0,0,0,35,0,0,0,290,0,0,0,34,0,0,0,289,0,0,0,33,0,0,0,288,0,0,0,32,0,0,0,285,0,0,0,31,0,0,0,283,0,0,0,30,0,0,0,281,0,0,0,29,0,0,0,278,0,0,0,28,0,0,0,274,0,0,0,27,0,0,0,269,0,0,0,26,0,0,0,266,0,0,0,25,0,0,0,263,0,0,0,24,0,0,0,259,0,0,0,23,0,0,0,256,0,0,0,22,0,0,0,251,0,0,0,21,0,0,0,248,0,0,0,20,0,0,0,244,0,0,0,19,0,0,0,242,0,0,0,18,0,0,0,239,0,0,0,17,0,0,0,236,0,0,0,16,0,0,0,234,0,0,0,15,0,0,0,231,0,0,0,14,0,0,0,228,0,0,0,13,0,0,0,223,0,0,0,12,0,0,0,220,0,0,0,11,0,0,0,215,0,0,0,10,0,0,0,213,0,0,0,9,0,0,0,211,0,0,0,8,0,0,0,208,0,0,0,7,0,0,0,205,0,0,0,6,0,0,0,202,0,0,0,5,0,0,0,199,0,0,0,4,0,0,0,197,0,0,0,3,0,0,0,195,0,0,0,2,0,0,0,191,0,0,0,1,0,0,0,186,0,0,0,184,0,0,0,181,0,0,0,176,0,0,0,172,0,0,0,169,0,0,0,165,0,0,0,163,0,0,0,162,0,0,0,161,0,0,0,160,0,0,0,159,0,0,0,158,0,0,0,157,0,0,0,164,0,0,0,166,0,0,0,168,0,0,0,171,0,0,0,173,0,0,0,167,0,0,0,170,0,0,0,179,0,0,0,175,0,0,0,174,0,0,0,177,0,0,0,178,0,0,0,180,0,0,0,183,0,0,0,182,0,0,0,185,0,0,0,188,0,0,0,187,0,0,0,189,0,0,0,190,0,0,0,192,0,0,0,200,0,0,0,201,0,0,0,206,0,0,0,196,0,0,0,198,0,0,0,193,0,0,0,194,0,0,0,203,0,0,0,204,0,0,0,207,0,0,0,209,0,0,0,210,0,0,0,212,0,0,0,214,0,0,0,57,0,0,0,217,0,0,0,216,0,0,0,58,0,0,0,221,0,0,0,218,0,0,0,59,0,0,0,219,0,0,0,60,0,0,0,222,0,0,0,224,0,0,0,61,0,0,0,225,0,0,0,62,0,0,0,226,0,0,0,227,0,0,0,63,0,0,0,229,0,0,0,230,0,0,0,64,0,0,0,232,0,0,0,233,0,0,0,65,0,0,0,235,0,0,0,237,0,0,0,238,0,0,0,66,0,0,0,240,0,0,0,67,0,0,0,241,0,0,0,68,0,0,0,243,0,0,0,245,0,0,0,69,0,0,0,246,0,0,0,70,0,0,0,247,0,0,0,249,0,0,0,71,0,0,0,250,0,0,0,253,0,0,0,252,0,0,0,72,0,0,0,254,0,0,0,73,0,0,0,255,0,0,0,74,0,0,0,257,0,0,0,258,0,0,0,75,0,0,0,260,0,0,0,76,0,0,0,261,0,0,0,77,0,0,0,262,0,0,0,78,0,0,0,264,0,0,0,265,0,0,0,79,0,0,0,267,0,0,0,273,0,0,0,80,0,0,0,268,0,0,0,81,0,0,0,275,0,0,0,82,0,0,0,271,0,0,0,83,0,0,0,270,0,0,0,84,0,0,0,272,0,0,0,276,0,0,0,85,0,0,0,277,0,0,0,86,0,0,0,279,0,0,0,280,0,0,0,87,0,0,0,282,0,0,0,284,0,0,0,88,0,0,0,286,0,0,0,89,0,0,0,287,0,0,0,156,0,0,0,90,0,0,0,155,0,0,0,91,0,0,0,154,0,0,0,92,0,0,0,153,0,0,0,152,0,0,0,93,0,0,0,151,0,0,0,150,0,0,0,94,0,0,0,149,0,0,0,95,0,0,0,148,0,0,0,147,0,0,0,96,0,0,0,146,0,0,0,145,0,0,0,97,0,0,0,144,0,0,0,143,0,0,0,98,0,0,0,142,0,0,0,141,0,0,0,140,0,0,0,99,0,0,0,139,0,0,0,100,0,0,0,138,0,0,0,101,0,0,0,137,0,0,0,136,0,0,0,102,0,0,0,135,0,0,0,103,0,0,0,134,0,0,0,104,0,0,0,133,0,0,0,132,0,0,0,105,0,0,0,131,0,0,0,106,0,0,0,130,0,0,0,107,0,0,0,129,0,0,0,108,0,0,0,128,0,0,0,127,0,0,0,126,0,0,0,109,0,0,0,125,0,0,0,124,0,0,0,110,0,0,0,123,0,0,0,122,0,0,0,121,0,0,0,120,0,0,0,111,0,0,0,119,0,0,0,118,0,0,0,117,0,0,0,116,0,0,0,115,0,0,0,112,0,0,0,114,0,0,0,113,0,0,0,112,0,0,0,111,0,0,0,110,0,0,0,109,0,0,0,108,0,0,0,107,0,0,0,327,0,0,0,106,0,0,0,105,0,0,0,104,0,0,0,103,0,0,0,102,0,0,0,101,0,0,0,100,0,0,0,99,0,0,0,98,0,0,0,97,0,0,0,96,0,0,0,95,0,0,0,94,0,0,0,93,0,0,0,92,0,0,0,91,0,0,0,90,0,0,0,89,0,0,0,88,0,0,0,87,0,0,0,86,0,0,0,85,0,0,0,84,0,0,0,83,0,0,0,82,0,0,0,81,0,0,0,80,0,0,0,79,0,0,0,78,0,0,0,77,0,0,0,76,0,0,0,75,0,0,0,74,0,0,0,73,0,0,0,72,0,0,0,71,0,0,0,70,0,0,0,69,0,0,0,68,0,0,0,67,0,0,0,66,0,0,0,65,0,0,0,64,0,0,0,63,0,0,0,62,0,0,0,61,0,0,0,60,0,0,0,59,0,0,0,58,0,0,0,57,0,0,0,113,0,0,0,326,0,0,0,114,0,0,0,115,0,0,0,116,0,0,0,117,0,0,0,118,0,0,0,119,0,0,0,120,0,0,0,121,0,0,0,122,0,0,0,123,0,0,0,124,0,0,0,125,0,0,0,126,0,0,0,127,0,0,0,128,0,0,0,129,0,0,0,130,0,0,0,131,0,0,0,132,0,0,0,133,0,0,0,134,0,0,0,135,0,0,0,136,0,0,0,137,0,0,0,138,0,0,0,139,0,0,0,140,0,0,0,141,0,0,0,142,0,0,0,143,0,0,0,144,0,0,0,145,0,0,0,146,0,0,0,147,0,0,0,148,0,0,0,149,0,0,0,150,0,0,0,151,0,0,0,152,0,0,0,153,0,0,0,154,0,0,0,155,0,0,0,156,0,0,0,287,0,0,0,286,0,0,0,284,0,0,0,282,0,0,0,280,0,0,0,279,0,0,0,277,0,0,0,276,0,0,0,272,0,0,0,270,0,0,0,271,0,0,0,275,0,0,0,268,0,0,0,273,0,0,0,267,0,0,0,265,0,0,0,264,0,0,0,262,0,0,0,261,0,0,0,260,0,0,0,258,0,0,0,257,0,0,0,255,0,0,0,254,0,0,0,252,0,0,0,253,0,0,0,250,0,0,0,249,0,0,0,247,0,0,0,246,0,0,0,245,0,0,0,243,0,0,0,241,0,0,0,240,0,0,0,238,0,0,0,237,0,0,0,235,0,0,0,233,0,0,0,232,0,0,0,230,0,0,0,229,0,0,0,227,0,0,0,226,0,0,0,225,0,0,0,224,0,0,0,222,0,0,0,219,0,0,0,218,0,0,0,221,0,0,0,216,0,0,0,217,0,0,0,214,0,0,0,212,0,0,0,210,0,0,0,209,0,0,0,207,0,0,0,204,0,0,0,203,0,0,0,194,0,0,0,193,0,0,0,198,0,0,0,196,0,0,0,328,0,0,0,206,0,0,0,201,0,0,0,200,0,0,0,192,0,0,0,190,0,0,0,189,0,0,0,187,0,0,0,188,0,0,0,185,0,0,0,182,0,0,0,183,0,0,0,180,0,0,0,178,0,0,0,177,0,0,0,174,0,0,0,175,0,0,0,179,0,0,0,170,0,0,0,167,0,0,0,173,0,0,0,171,0,0,0,168,0,0,0,2397,0,0,0,166,0,0,0,164,0,0,0,157,0,0,0,158,0,0,0,159,0,0,0,160,0,0,0,325,0,0,0,161,0,0,0,2396,0,0,0,162,0,0,0,324,0,0,0,163,0,0,0,165,0,0,0,1,0,0,0,169,0,0,0,2,0,0,0,172,0,0,0,3,0,0,0,4,0,0,0,176,0,0,0,5,0,0,0,181,0,0,0,184,0,0,0,6,0,0,0,56,0,0,0,186,0,0,0,7,0,0,0,191,0,0,0,8,0,0,0,195,0,0,0,9,0,0,0,197,0,0,0,10,0,0,0,323,0,0,0,199,0,0,0,11,0,0,0,202,0,0,0,322,0,0,0,12,0,0,0,55,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,321,0,0,0,205,0,0,0,16,0,0,0,320,0,0,0,208,0,0,0,17,0,0,0,211,0,0,0,54,0,0,0,18,0,0,0,213,0,0,0,215,0,0,0,319,0,0,0,220,0,0,0,223,0,0,0,228,0,0,0,231,0,0,0,234,0,0,0,236,0,0,0,53,0,0,0,239,0,0,0,242,0,0,0,244,0,0,0,248,0,0,0,318,0,0,0,251,0,0,0,256,0,0,0,54,0,0,0,259,0,0,0,263,0,0,0,317,0,0,0,266,0,0,0,55,0,0,0,269,0,0,0,274,0,0,0,278,0,0,0,316,0,0,0,281,0,0,0,283,0,0,0,52,0,0,0,285,0,0,0,288,0,0,0,51,0,0,0,289,0,0,0,290,0,0,0,291,0,0,0,292,0,0,0,50,0,0,0,293,0,0,0,315,0,0,0,294,0,0,0,19,0,0,0,49,0,0,0,295,0,0,0,20,0,0,0,314,0,0,0,21,0,0,0,48,0,0,0,296,0,0,0,22,0,0,0,297,0,0,0,313,0,0,0,23,0,0,0,298,0,0,0,24,0,0,0,47,0,0,0,299,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,312,0,0,0,28,0,0,0,29,0,0,0,46,0,0,0,30,0,0,0,31,0,0,0,311,0,0,0,32,0,0,0,33,0,0,0,45,0,0,0,34,0,0,0,300,0,0,0,35,0,0,0,301,0,0,0,36,0,0,0,310,0,0,0,302,0,0,0,37,0,0,0,303,0,0,0,38,0,0,0,304,0,0,0,44,0,0,0,39,0,0,0,309,0,0,0,305,0,0,0,43,0,0,0,40,0,0,0,306,0,0,0,308,0,0,0,41,0,0,0,307,0,0,0,42,0,0,2,1,0,0,3,1,0,0,4,1,0,0,5,1,0,0,6,1,0,0,7,1,0,0,8,1,0,0,9,1,0,0,10,1,0,0,11,1,0,0,12,1,0,0,13,1,0,0,14,1,0,0,15,1,0,0,16,1,0,0,17,1,0,0,18,1,0,0,19,1,0,0,20,1,0,0,21,1,0,0,22,1,0,0,23,1,0,0,24,1,0,0,25,1,0,0,26,1,0,0,27,1,0,0,28,1,0,0,29,1,0,0,30,1,0,0,31,1,0,0,32,1,0,0,33,1,0,0,34,1,0,0,35,1,0,0,36,1,0,0,37,1,0,0,38,1,0,0,39,1,0,0,40,1,0,0,41,1,0,0,42,1,0,0,43,1,0,0,44,1,0,0,45,1,0,0,46,1,0,0,47,1,0,0,48,1,0,0,49,1,0,0,50,1,0,0,51,1,0,0,52,1,0,0,53,1,0,0,54,48,0,0,55,47,0,0,56,2393,0,0,56,329,0,0,57,4,0,0,58,4,0,0,59,4,0,0,60,4,0,0,61,4,0,0,62,4,0,0,63,4,0,0,64,4,0,0,65,4,0,0,66,4,0,0,67,4,0,0,68,4,0,0,69,4,0,0,70,4,0,0,71,4,0,0,72,4,0,0,73,4,0,0,74,4,0,0,75,4,0,0,76,4,0,0,77,4,0,0,78,4,0,0,79,4,0,0,80,4,0,0,81,4,0,0,82,4,0,0,83,4,0,0,84,4,0,0,85,4,0,0,86,4,0,0,87,4,0,0,88,4,0,0,89,4,0,0,90,4,0,0,91,4,0,0,92,4,0,0,93,4,0,0,94,4,0,0,95,4,0,0,96,4,0,0,97,4,0,0,98,4,0,0,99,4,0,0,100,4,0,0,101,4,0,0,102,4,0,0,103,4,0,0,104,4,0,0,105,4,0,0,106,4,0,0,107,4,0,0,108,4,0,0,109,4,0,0,110,4,0,0,111,4,0,0,112,4,0,0,113,4,0,0,114,4,0,0,115,4,0,0,116,4,0,0,117,4,0,0,118,4,0,0,119,4,0,0,120,4,0,0,121,4,0,0,122,4,0,0,123,4,0,0,124,4,0,0,125,4,0,0,126,4,0,0,127,4,0,0,128,4,0,0,129,4,0,0,130,4,0,0,131,4,0,0,132,4,0,0,133,4,0,0,134,4,0,0,135,4,0,0,136,4,0,0,137,4,0,0,138,4,0,0,139,4,0,0,140,4,0,0,141,4,0,0,142,4,0,0,143,4,0,0,144,4,0,0,145,4,0,0,146,4,0,0,147,4,0,0,148,4,0,0,149,4,0,0,150,4,0,0,151,4,0,0,152,4,0,0,153,4,0,0,154,4,0,0,155,4,0,0,156,4,0,0,157,4,0,0,158,4,0,0,159,4,0,0,160,4,0,0,161,4,0,0,162,4,0,0,163,4,0,0,164,4,0,0,165,4,0,0,166,4,0,0,167,4,0,0,168,4,0,0,169,4,0,0,170,4,0,0,171,4,0,0,172,4,0,0,173,4,0,0,174,4,0,0,175,4,0,0,176,4,0,0,177,4,0,0,178,4,0,0,179,4,0,0,180,4,0,0,181,4,0,0,182,4,0,0,183,4,0,0,184,4,0,0,185,4,0,0,186,4,0,0,187,4,0,0,188,4,0,0,189,4,0,0,190,4,0,0,191,4,0,0,192,4,0,0,193,4,0,0,194,4,0,0,195,4,0,0,196,4,0,0,197,4,0,0,198,4,0,0,199,4,0,0,200,4,0,0,201,4,0,0,202,4,0,0,203,4,0,0,204,4,0,0,205,4,0,0,206,4,0,0,207,4,0,0,208,4,0,0,209,4,0,0,210,4,0,0,211,4,0,0,212,4,0,0,213,4,0,0,214,4,0,0,215,4,0,0,216,4,0,0,217,4,0,0,218,4,0,0,219,4,0,0,220,4,0,0,221,4,0,0,222,4,0,0,223,4,0,0,224,4,0,0,225,4,0,0,226,4,0,0,227,4,0,0,228,4,0,0,229,4,0,0,230,4,0,0,231,4,0,0,232,4,0,0,233,4,0,0,234,4,0,0,235,4,0,0,236,4,0,0,237,4,0,0,238,4,0,0,239,4,0,0,240,4,0,0,241,4,0,0,242,4,0,0,243,4,0,0,244,4,0,0,245,4,0,0,246,4,0,0,247,4,0,0,248,4,0,0,249,4,0,0,250,4,0,0,251,4,0,0,252,4,0,0,253,4,0,0,254,4,0,0,255,4,0,0,256,4,0,0,257,4,0,0,258,4,0,0,259,4,0,0,260,4,0,0,261,4,0,0,262,4,0,0,263,4,0,0,264,4,0,0,265,4,0,0,266,4,0,0,267,4,0,0,268,4,0,0,269,4,0,0,270,4,0,0,271,4,0,0,272,4,0,0,273,4,0,0,274,4,0,0,275,4,0,0,276,4,0,0,277,4,0,0,278,4,0,0,279,4,0,0,280,4,0,0,281,4,0,0,282,4,0,0,283,4,0,0,284,4,0,0,285,4,0,0,286,4,0,0,287,4,0,0,288,4,0,0,289,4,0,0,290,4,0,0,291,4,0,0,292,4,0,0,293,4,0,0,294,4,0,0,295,4,0,0,296,4,0,0,297,4,0,0,298,4,0,0,299,4,0,0,300,4,0,0,301,4,0,0,302,4,0,0,303,4,0,0,304,4,0,0,305,4,0,0,306,4,0,0,307,4,0,0,308,4,0,0,309,4,0,0,310,4,0,0,311,4,0,0,312,4,0,0,313,4,0,0,314,4,0,0,315,4,0,0,316,4,0,0,317,4,0,0,318,4,0,0,319,4,0,0,320,4,0,0,321,4,0,0,322,4,0,0,323,4,0,0,324,4,0,0,325,4,0,0,326,4,0,0,327,4,0,0,328,4,0,0,329,2001,3,0,329,2262,1,1,329,2038,3,2,329,781,3,3,329,1542,3,4,329,1574,3,5,329,2029,3,6,329,2033,3,7,329,1733,3,8,329,749,3,9,329,2304,3,10,329,1876,3,11,329,2017,3,12,329,850,3,13,329,1804,3,14,329,714,3,15,329,652,3,16,329,896,3,17,329,768,3,18,329,704,3,19,329,2199,3,20,329,799,3,21,329,537,3,22,329,751,3,23,329,547,3,24,329,1427,3,25,329,1997,3,26,329,818,3,27,329,1278,3,28,329,639,3,29,329,1969,3,30,329,690,3,31,329,2059,3,32,329,675,3,33,329,1680,3,34,329,1966,3,35,329,852,3,36,329,750,3,37,329,1880,3,38,329,1959,3,39,329,583,3,40,329,2091,3,41,329,1836,3,42,329,819,3,43,329,1747,3,44,329,1765,3,45,329,1944,3,46,329,1509,3,47,329,607,3,48,329,612,3,49,329,1930,3,50,329,2166,3,51,329,1108,3,52,329,589,3,53,329,2192,3,54,329,1866,3,55,329,619,3,56,329,1893,3,57,329,1844,3,58,329,611,3,59,329,1848,3,60,329,1897,3,61,329,870,3,62,329,609,3,63,329,1369,3,64,329,2074,3,65,329,539,3,66,329,2096,3,67,329,2130,3,68,329,636,3,69,329,723,3,70,329,56,3,71,329,552,3,72,329,2100,3,73,329,2221,3,74,329,633,3,75,329,669,3,76,329,2128,3,77,329,1991,3,78,329,815,3,79,329,2161,3,80,329,1704,3,81,329,2155,3,82,329,1948,3,83,329,1477,3,84,329,2164,3,85,329,2133,3,86,329,1794,3,87,329,1649,3,88,329,2257,3,89,329,2141,3,90,329,638,3,91,329,659,3,92,329,2314,3,93,329,1951,3,94,329,1306,3,95,329,1979,3,96,329,1958,3,97,329,1810,3,98,329,2055,3,99,329,833,3,100,329,2012,3,101,329,693,3,102,329,694,3,103,329,1852,3,104,329,1787,3,105,329,2188,3,106,329,820,3,107,329,821,3,108,329,1900,3,109,329,548,3,110,329,812,3,111,329,666,3,112,329,742,3,113,329,662,3,114,329,2159,3,115,329,2151,3,116,329,610,3,117,329,1896,3,118,329,716,3,119,329,2043,3,120,329,2037,3,121,329,2306,3,122,329,532,3,123,329,2045,3,124,329,2031,3,125,329,2054,3,126,329,1995,3,127,329,1895,3,128,329,1984,3,129,329,544,3,130,329,683,3,131,329,2110,3,132,329,1899,3,133,329,551,3,134,329,1940,3,135,329,2072,3,136,329,734,3,137,329,1862,3,138,329,600,3,139,329,1830,3,140,329,1337,3,141,329,748,3,142,329,578,3,143,329,1527,3,144,329,810,3,145,329,689,3,146,329,2106,3,147,329,641,3,148,329,563,3,149,329,1874,3,150,329,1955,3,151,329,1668,3,152,329,855,3,153,329,2109,3,154,329,534,3,155,329,579,3,156,329,695,3,157,329,555,3,158,329,1925,3,159,329,1394,3,160,329,1798,3,161,329,907,3,162,329,2179,3,163,329,1869,3,164,329,1858,3,165,329,1856,3,166,329,1994,3,167,329,758,3,168,329,645,3,169,329,849,3,170,329,2006,3,171,329,2232,3,172,329,1840,3,173,329,1924,3,174,329,924,3,175,329,863,3,176,329,2070,3,177,329,2073,3,178,329,2336,3,179,329,1185,3,180,329,564,3,181,329,2077,3,182,329,1977,3,183,329,566,3,184,329,839,3,185,329,557,3,186,329,546,3,187,329,559,3,188,329,594,3,189,329,1860,3,190,329,2295,3,191,329,540,3,192,329,2098,3,193,329,642,3,194,329,1898,3,195,329,2174,3,196,329,1909,3,197,329,2123,3,198,329,2165,3,199,329,2136,3,200,329,823,3,201,329,702,3,202,329,785,3,203,329,1605,3,204,329,1864,3,205,329,2135,3,206,329,2216,3,207,329,541,3,208,329,2103,3,209,329,2048,3,210,329,674,3,211,329,775,3,212,329,2315,3,213,329,1861,3,214,329,1453,3,215,329,712,3,216,329,1559,3,217,329,601,3,218,329,657,3,219,329,1821,3,220,329,2175,3,221,329,1021,3,222,329,866,3,223,329,787,3,224,329,614,3,225,329,1923,3,226,329,1720,3,227,329,1916,3,228,329,1865,3,229,329,2002,3,230,329,808,3,231,329,1776,3,232,329,1780,3,233,329,2349,3,234,329,2348,1,235,329,2330,1,236,329,2309,1,237,329,2301,1,238,329,2300,1,239,329,2298,1,240,329,2296,1,241,329,2292,1,242,329,2290,1,243,329,2287,1,244,329,2281,1,245,329,2279,1,246,329,2275,1,247,329,2274,1,248,329,2273,1,249,329,2271,1,250,329,2270,1,251,329,2269,1,252,329,2268,1,253,329,2267,1,254,329,2266,1,255,329,2265,1,256,329,2264,1,257,329,2263,1,258,329,2272,1,259,329,2277,1,260,329,2276,1,261,329,2278,1,262,329,2284,1,263,329,2280,1,264,329,2283,1,265,329,2282,1,266,329,2288,1,267,329,2285,1,268,329,2293,1,269,329,2291,1,270,329,2286,1,271,329,2289,1,272,329,2294,1,273,329,2295,1,274,329,2297,1,275,329,2299,1,276,329,2314,1,277,329,2304,1,278,329,2306,1,279,329,2315,1,280,329,2318,1,281,329,2336,1,282,329,2354,1,283,329,2349,1,284,329,2257,1,285,329,2253,1,286,329,2237,1,287,329,2232,1,288,329,2221,1,289,329,2216,1,290,329,2253,1,291,329,2212,1,292,329,2237,1,293,329,2209,1,294,329,2197,1,295,329,1861,0,0,329,1860,0,0,329,1864,0,0,329,1865,0,0,329,1866,0,0,329,1876,0,0,329,1874,0,0,329,1893,0,0,329,1896,0,0,329,1897,0,0,329,1898,0,0,329,1900,0,0,329,1916,0,0,329,1899,0,0,329,1923,0,0,329,1925,0,0,329,1924,0,0,329,1944,0,0,329,1940,0,0,329,1930,0,0,329,1958,0,0,329,1959,0,0,329,1951,0,0,329,1966,0,0,329,1955,0,0,329,1969,0,0,329,1979,0,0,329,1977,0,0,329,1984,0,0,329,1991,0,0,329,1995,0,0,329,1997,0,0,329,2002,0,0,329,2001,0,0,329,2006,0,0,329,2017,0,0,329,2012,0,0,329,2029,0,0,329,2031,0,0,329,2033,0,0,329,2037,0,0,329,2038,0,0,329,2043,0,0,329,2045,0,0,329,2054,0,0,329,2055,0,0,329,2048,0,0,329,2073,0,0,329,2070,0,0,329,2074,0,0,329,2072,0,0,329,2077,0,0,329,2091,0,0,329,2096,0,0,329,2100,0,0,329,2103,0,0,329,2098,0,0,329,2109,0,0,329,2110,0,0,329,2123,0,0,329,2130,0,0,329,2128,0,0,329,2141,0,0,329,2135,0,0,329,2136,0,0,329,2133,0,0,329,2155,0,0,329,2165,0,0,329,2161,0,0,329,2164,0,0,329,2166,0,0,329,2175,0,0,329,2179,0,0,329,2188,0,0,329,2192,0,0,329,2199,0,0,329,1856,0,0,329,1852,0,0,329,1848,0,0,329,1844,0,0,329,1840,0,0,329,1836,0,0,329,1830,0,0,329,1821,0,0,329,1810,0,0,329,2106,0,0,329,330,0,0,329,346,0,0,329,1521,0,0,329,1490,0,0,329,1511,0,0,329,1483,0,0,329,1467,0,0,329,1480,0,0,329,1458,0,0,329,1457,0,0,329,1445,0,0,329,1449,0,0,329,1434,0,0,329,1429,0,0,329,1395,0,0,329,1386,0,0,329,1379,0,0,329,1371,0,0,329,1365,0,0,329,1356,0,0,329,1347,0,0,329,1331,0,0,329,1322,0,0,329,1268,0,0,329,1266,0,0,329,1265,0,0,329,1255,0,0,329,1046,0,0,329,1226,0,0,329,1218,0,0,329,1210,0,0,329,1207,0,0,329,1205,0,0,329,1195,0,0,329,1200,0,0,329,1080,0,0,329,952,0,0,329,1188,0,0,329,1184,0,0,329,1178,0,0,329,1136,0,0,329,1095,0,0,329,1135,0,0,329,1130,0,0,329,1151,0,0,329,1125,0,0,329,1128,0,0,329,1120,0,0,329,1118,0,0,329,1119,0,0,329,1117,0,0,329,1110,0,0,329,1111,0,0,329,1104,0,0,329,1103,0,0,329,1102,0,0,329,1101,0,0,329,1099,0,0,329,1109,0,0,329,1095,0,0,329,1091,0,0,329,1093,0,0,329,1089,0,0,329,1096,0,0,329,1087,0,0,329,1080,0,0,329,1077,0,0,329,1079,0,0,329,1083,0,0,329,1078,0,0,329,1074,0,0,329,1076,0,0,329,1066,0,0,329,1070,0,0,329,1068,0,0,329,1058,0,0,329,1079,0,0,329,1083,0,0,329,1078,0,0,329,1074,0,0,329,1076,0,0,329,1066,0,0,329,1070,0,0,329,1068,0,0,329,1058,0,0,329,1060,0,0,329,1053,0,0,329,846,3,296,329,1033,0,0,329,1029,0,0,329,1022,0,0,329,1023,0,0,329,1012,0,0,329,999,0,0,329,989,0,0,329,981,0,0,329,970,0,0,329,957,0,0,329,952,0,0,329,977,0,0,329,946,0,0,329,950,0,0,329,931,0,0,329,930,0,0,329,928,0,0,329,919,0,0,329,925,0,0,329,920,0,0,329,906,0,0,329,909,0,0,329,891,0,0,329,895,0,0,329,888,0,0,329,2299,0,0,329,2209,0,0,329,2197,0,0,329,887,0,0,329,882,0,0,329,2314,0,0,329,2237,0,0,329,2232,0,0,329,2221,0,0,329,880,0,0,329,874,0,0,329,2315,0,0,329,2216,0,0,329,871,0,0,329,873,0,0,329,56,0,0,329,2181,0,0,329,2362,0,0,330,1,0,0,330,329,0,0,330,331,0,0,331,341,1,297,331,338,1,298,331,333,1,299,331,332,1,300,331,344,0,0,332,6,0,0,333,336,0,0,333,329,0,0,333,334,0,0,333,335,1,301,334,10,0,0,335,4,0,0,336,1,0,0,336,329,0,0,336,946,0,0,336,337,0,0,337,329,0,0,337,946,0,0,337,1,0,0,337,1096,0,0,338,336,0,0,338,329,0,0,338,339,0,0,338,340,1,301,339,10,0,0,340,4,0,0,341,336,0,0,341,329,0,0,341,342,0,0,341,343,1,301,342,10,0,0,343,4,0,0,344,1,0,0,344,329,0,0,344,950,0,0,344,345,0,0,345,35,0,0,346,1,0,0,346,329,0,0,346,347,0,0,347,411,1,302,347,409,1,303,347,407,1,304,347,405,1,305,347,403,1,306,347,401,1,307,347,399,1,308,347,397,1,309,347,396,1,310,347,394,1,311,347,392,1,312,347,390,1,313,347,388,1,314,347,386,1,315,347,384,1,316,347,382,1,317,347,483,1,318,347,481,1,319,347,479,1,320,347,477,1,321,347,475,1,322,347,473,1,323,347,471,1,324,347,469,1,325,347,467,1,326,347,465,1,327,347,463,1,328,347,461,1,329,347,459,1,330,347,457,1,331,347,455,1,332,347,453,1,333,347,451,1,334,347,449,1,335,347,447,1,336,347,445,1,337,347,443,1,338,347,441,1,339,347,426,1,340,347,424,1,341,347,422,1,342,347,421,1,343,347,420,1,344,347,419,1,345,347,418,1,346,347,417,1,347,347,416,1,348,347,414,1,349,347,412,1,350,347,410,1,351,347,408,1,352,347,406,1,353,347,404,1,354,347,402,1,355,347,400,1,356,347,398,1,357,347,395,1,358,347,393,1,359,347,391,1,360,347,389,1,361,347,387,1,362,347,385,1,363,347,383,1,364,347,381,1,365,347,380,1,366,347,379,1,367,347,378,1,368,347,377,1,369,347,376,1,370,347,375,1,371,347,374,1,372,347,373,1,373,347,372,1,374,347,371,1,375,347,370,1,376,347,369,1,377,347,368,1,378,347,367,1,379,347,366,1,380,347,365,1,381,347,364,1,382,347,363,1,383,347,362,1,384,347,361,1,385,347,360,1,386,347,359,1,387,347,358,1,388,347,357,1,389,347,356,1,390,347,355,1,391,347,354,1,392,347,353,1,393,347,352,1,394,347,351,1,395,347,350,1,396,347,349,1,397,347,348,1,300,347,413,1,398,347,415,1,399,347,423,1,400,347,490,1,401,347,492,1,402,347,493,1,403,347,494,1,404,347,489,1,405,347,488,1,406,347,487,1,407,347,429,1,408,347,1522,1,409,347,1531,1,410,347,1543,1,411,347,1549,1,412,347,1545,1,413,347,1553,1,414,347,1569,1,415,347,1572,1,416,347,1597,1,417,347,1588,1,418,347,1604,1,419,347,1592,1,420,347,1618,1,421,347,1614,1,422,347,491,1,423,347,1612,1,424,347,1626,1,425,347,1637,1,426,347,1641,1,427,347,1643,1,428,347,1652,1,429,347,1659,1,430,347,1663,1,431,347,1658,1,432,347,1671,1,433,347,1681,1,434,347,1694,1,435,347,1682,1,436,347,1689,1,437,347,1705,1,438,347,1709,1,439,347,1713,1,440,347,1714,1,441,347,1734,1,442,347,1735,1,443,347,1743,1,444,347,1740,1,445,347,1745,1,446,347,1751,1,447,347,1764,1,448,347,1761,1,449,347,1525,0,0,347,425,1,450,347,427,1,451,347,428,1,452,347,430,1,453,347,431,1,454,347,432,1,455,347,433,1,456,347,434,1,457,347,436,1,458,347,437,1,459,347,438,1,460,347,440,1,461,347,442,1,462,347,444,1,463,347,446,1,464,347,448,1,465,347,450,1,466,347,452,1,467,347,454,1,468,347,456,1,469,347,458,1,470,347,460,1,471,347,462,1,472,347,464,1,473,347,466,1,474,347,468,1,475,347,470,1,476,347,472,1,477,347,474,1,478,347,476,1,479,347,478,1,480,347,480,1,481,347,482,1,482,347,484,1,483,347,485,1,484,347,486,1,485,347,495,1,486,347,496,1,487,347,499,1,488,347,502,1,489,347,505,1,490,347,508,1,491,347,511,1,492,347,514,1,493,347,517,1,494,347,520,1,495,347,523,1,496,347,526,1,497,347,529,1,498,348,6,0,0,349,7,0,0,350,7,0,0,351,7,0,0,352,7,0,0,353,7,0,0,354,7,0,0,355,7,0,0,356,7,0,0,357,7,0,0,358,7,0,0,359,7,0,0,360,7,0,0,361,7,0,0,362,7,0,0,363,7,0,0,364,7,0,0,365,7,0,0,366,7,0,0,367,7,0,0,368,7,0,0,369,7,0,0,370,7,0,0,371,7,0,0,372,7,0,0,373,7,0,0,374,7,0,0,375,7,0,0,376,7,0,0,377,7,0,0,378,6,0,0,379,7,0,0,380,7,0,0,381,7,0,0,382,7,0,0,383,7,0,0,384,7,0,0,385,7,0,0,386,7,0,0,387,7,0,0,388,7,0,0,389,7,0,0,390,7,0,0,391,7,0,0,392,7,0,0,393,7,0,0,394,7,0,0,395,7,0,0,396,7,0,0,397,7,0,0,398,7,0,0,399,7,0,0,400,7,0,0,401,7,0,0,402,7,0,0,403,7,0,0,404,7,0,0,405,7,0,0,406,7,0,0,407,7,0,0,408,7,0,0,409,7,0,0,410,7,0,0,411,7,0,0,412,7,0,0,413,7,0,0,414,7,0,0,415,7,0,0,416,7,0,0,417,7,0,0,418,7,0,0,419,7,0,0,420,7,0,0,421,7,0,0,422,7,0,0,423,6,0,0,424,7,0,0,425,6,0,0,426,7,0,0,427,7,0,0,428,7,0,0,429,435,0,0,430,7,0,0,431,7,0,0,432,7,0,0,433,7,0,0,434,7,0,0,435,1,0,0,435,329,0,0,435,439,0,0,436,7,0,0,437,7,0,0,438,7,0,0,439,1077,0,0,439,329,0,0,439,1,0,0,440,7,0,0,441,7,0,0,442,7,0,0,443,7,0,0,444,7,0,0,445,7,0,0,446,7,0,0,447,7,0,0,448,7,0,0,449,7,0,0,450,7,0,0,451,7,0,0,452,7,0,0,453,7,0,0,454,7,0,0,455,7,0,0,456,7,0,0,457,7,0,0,458,7,0,0,459,7,0,0,460,7,0,0,461,7,0,0,462,7,0,0,463,7,0,0,464,7,0,0,465,7,0,0,466,7,0,0,467,7,0,0,468,7,0,0,469,7,0,0,470,7,0,0,471,7,0,0,472,7,0,0,473,7,0,0,474,7,0,0,475,7,0,0,476,7,0,0,477,7,0,0,478,7,0,0,479,7,0,0,480,7,0,0,481,7,0,0,482,7,0,0,483,7,0,0,484,7,0,0,485,7,0,0,486,7,0,0,487,7,0,0,488,7,0,0,489,7,0,0,490,7,0,0,491,7,0,0,492,7,0,0,493,7,0,0,494,7,0,0,495,7,0,0,496,498,1,301,496,497,0,0,496,329,0,0,496,336,0,0,497,10,0,0,498,4,0,0,499,501,1,301,499,500,0,0,499,329,0,0,499,336,0,0,500,10,0,0,501,4,0,0,502,504,1,301,502,503,0,0,502,329,0,0,502,336,0,0,503,10,0,0,504,4,0,0,505,329,0,0,505,506,0,0,505,507,1,301,505,336,0,0,506,10,0,0,507,4,0,0,508,509,0,0,508,329,0,0,508,336,0,0,508,510,1,301,509,10,0,0,510,4,0,0,511,512,0,0,511,329,0,0,511,336,0,0,511,513,1,301,512,10,0,0,513,4,0,0,514,516,1,301,514,515,0,0,514,329,0,0,514,336,0,0,515,10,0,0,516,4,0,0,517,518,0,0,517,519,1,301,517,329,0,0,517,336,0,0,518,10,0,0,519,4,0,0,520,522,1,301,520,336,0,0,520,329,0,0,520,521,0,0,521,10,0,0,522,4,0,0,523,525,1,301,523,336,0,0,523,329,0,0,523,524,0,0,524,10,0,0,525,4,0,0,526,528,1,301,526,336,0,0,526,329,0,0,526,527,0,0,527,10,0,0,528,4,0,0,529,531,1,301,529,336,0,0,529,329,0,0,529,530,0,0,530,10,0,0,531,4,0,0,532,533,0,0,532,329,0,0,532,536,0,0,533,10,0,0,534,329,0,0,534,535,0,0,534,536,0,0,535,10,0,0,536,329,0,0,536,946,0,0,536,1,0,0,536,1096,0,0,537,536,0,0,537,329,0,0,537,538,0,0,538,10,0,0,539,536,0,0,539,329,0,0,539,542,0,0,540,1096,0,0,540,329,0,0,540,550,0,0,541,543,0,0,541,536,0,0,541,329,0,0,542,10,0,0,543,10,0,0,544,536,0,0,544,329,0,0,544,545,0,0,545,10,0,0,546,1096,0,0,546,329,0,0,546,574,0,0,547,536,0,0,547,329,0,0,547,549,0,0,548,329,0,0,548,1096,0,0,548,560,0,0,549,10,0,0,550,13,0,0,550,558,0,0,550,553,0,0,551,536,0,0,551,329,0,0,551,554,0,0,552,536,0,0,552,556,0,0,552,329,0,0,554,10,0,0,555,1096,0,0,555,329,0,0,555,569,0,0,556,10,0,0,557,329,0,0,557,562,0,0,557,1096,0,0,558,30,0,0,559,1096,0,0,559,329,0,0,559,570,0,0,560,568,0,0,560,13,0,0,560,561,0,0,562,567,0,0,562,13,0,0,562,565,0,0,563,571,0,0,563,536,0,0,563,329,0,0,564,1096,0,0,564,329,0,0,564,584,0,0,566,329,0,0,566,1096,0,0,566,581,0,0,567,30,0,0,568,30,0,0,569,13,0,0,569,576,0,0,569,572,0,0,570,577,0,0,570,13,0,0,570,573,0,0,571,10,0,0,574,13,0,0,574,575,0,0,574,580,0,0,576,30,0,0,577,30,0,0,578,329,0,0,578,592,0,0,578,1096,0,0,579,587,0,0,579,1096,0,0,579,329,0,0,580,30,0,0,581,585,0,0,581,13,0,0,581,582,0,0,583,590,0,0,583,1089,0,0,583,329,0,0,584,595,0,0,584,586,0,0,584,13,0,0,585,30,0,0,587,13,0,0,587,597,0,0,587,588,0,0,589,1096,0,0,589,329,0,0,589,602,0,0,590,13,0,0,590,599,0,0,590,591,0,0,592,596,0,0,592,13,0,0,592,593,0,0,594,536,0,0,594,329,0,0,594,598,0,0,595,30,0,0,596,30,0,0,597,30,0,0,598,10,0,0,599,30,0,0,600,329,0,0,600,1096,0,0,600,604,0,0,601,1096,0,0,601,616,0,0,601,329,0,0,602,13,0,0,602,606,0,0,602,603,0,0,604,13,0,0,604,608,0,0,604,605,0,0,606,30,0,0,607,1096,0,0,607,329,0,0,607,613,0,0,608,30,0,0,609,623,0,0,609,1096,0,0,609,329,0,0,610,1096,0,0,610,329,0,0,610,628,0,0,611,1096,0,0,611,329,0,0,611,621,0,0,612,1096,0,0,612,625,0,0,612,329,0,0,613,617,0,0,613,615,0,0,613,13,0,0,614,329,0,0,614,536,0,0,614,620,0,0,616,618,0,0,616,626,0,0,616,13,0,0,617,30,0,0,619,632,0,0,619,329,0,0,619,1096,0,0,620,10,0,0,621,624,0,0,621,622,0,0,621,13,0,0,623,631,0,0,623,627,0,0,623,13,0,0,624,30,0,0,625,13,0,0,625,629,0,0,625,635,0,0,626,30,0,0,628,630,0,0,628,13,0,0,628,637,0,0,631,30,0,0,632,643,0,0,632,634,0,0,632,13,0,0,633,329,0,0,633,644,0,0,633,1096,0,0,635,30,0,0,636,640,0,0,636,336,0,0,636,328,1,301,636,329,0,0,637,30,0,0,638,329,0,0,638,654,0,0,638,1089,0,0,639,651,0,0,639,329,0,0,639,1096,0,0,640,10,0,0,641,647,0,0,641,329,0,0,641,1096,0,0,642,664,0,0,642,329,0,0,642,1096,0,0,643,30,0,0,644,646,0,0,644,650,0,0,644,13,0,0,645,329,0,0,645,648,0,0,645,336,0,0,645,328,1,301,647,653,0,0,647,649,0,0,647,13,0,0,648,10,0,0,650,30,0,0,651,658,0,0,651,655,0,0,651,13,0,0,652,329,0,0,652,661,0,0,652,1096,0,0,653,30,0,0,654,656,0,0,654,13,0,0,654,660,0,0,657,668,0,0,657,329,0,0,657,1096,0,0,658,30,0,0,659,663,0,0,659,329,0,0,659,536,0,0,660,30,0,0,661,673,0,0,661,665,0,0,661,13,0,0,662,1096,0,0,662,329,0,0,662,670,0,0,663,10,0,0,664,667,0,0,664,13,0,0,664,678,0,0,666,682,0,0,666,1096,0,0,666,329,0,0,668,676,0,0,668,671,0,0,668,13,0,0,669,329,0,0,669,1089,0,0,669,679,0,0,670,672,0,0,670,680,0,0,670,13,0,0,673,30,0,0,674,329,0,0,674,536,0,0,674,677,0,0,675,686,0,0,675,329,0,0,675,1096,0,0,676,30,0,0,677,10,0,0,678,30,0,0,679,681,0,0,679,685,0,0,679,13,0,0,680,30,0,0,682,684,0,0,682,687,0,0,682,13,0,0,683,697,0,0,683,329,0,0,683,1096,0,0,685,30,0,0,686,13,0,0,686,691,0,0,686,688,0,0,687,30,0,0,689,1089,0,0,689,329,0,0,689,692,0,0,690,722,1,499,690,802,0,0,690,329,0,0,690,707,0,0,691,30,0,0,692,13,0,0,692,700,0,0,692,696,0,0,693,1096,0,0,693,329,0,0,693,705,0,0,694,536,0,0,694,329,0,0,694,699,0,0,695,1089,0,0,695,329,0,0,695,703,0,0,697,13,0,0,697,701,0,0,697,698,0,0,699,10,0,0,700,30,0,0,701,30,0,0,702,802,0,0,702,329,0,0,702,729,1,499,702,715,0,0,703,13,0,0,703,710,0,0,703,706,0,0,704,1089,0,0,704,329,0,0,704,718,0,0,705,13,0,0,705,713,0,0,705,709,0,0,707,13,0,0,707,711,0,0,707,708,0,0,710,30,0,0,711,30,0,0,712,724,0,0,712,1096,0,0,712,329,0,0,713,30,0,0,714,719,0,0,714,727,0,0,714,1511,1,500,714,719,1,301,714,1226,1,499,715,721,0,0,715,13,0,0,715,717,0,0,716,1096,0,0,716,329,0,0,716,726,0,0,718,732,0,0,718,13,0,0,718,720,0,0,719,4,0,0,721,30,0,0,722,731,1,501,722,755,1,502,722,780,0,0,723,735,0,0,723,329,0,0,723,1089,0,0,724,13,0,0,724,728,0,0,724,725,0,0,726,730,0,0,726,13,0,0,726,733,0,0,727,1,0,0,727,329,0,0,727,946,0,0,727,737,0,0,728,30,0,0,729,770,1,502,729,741,1,501,729,786,0,0,731,738,0,0,731,1096,0,0,731,329,0,0,732,30,0,0,733,30,0,0,734,329,0,0,734,1096,0,0,734,743,0,0,735,13,0,0,735,744,0,0,735,736,0,0,737,1,0,0,737,740,0,0,737,329,0,0,737,946,0,0,738,13,0,0,738,746,0,0,738,739,0,0,740,35,0,0,741,1096,0,0,741,752,0,0,741,329,0,0,742,1089,0,0,742,329,0,0,742,760,0,0,743,13,0,0,743,747,0,0,743,745,0,0,744,30,0,0,746,30,0,0,747,30,0,0,748,753,0,0,748,536,0,0,748,329,0,0,749,802,0,0,749,773,1,499,749,329,0,0,749,756,0,0,750,329,0,0,750,764,0,0,750,1089,0,0,751,1096,0,0,751,329,0,0,751,763,0,0,752,759,0,0,752,13,0,0,752,754,0,0,753,10,0,0,755,4,0,0,756,757,0,0,756,13,0,0,756,761,0,0,758,329,0,0,758,772,0,0,758,1096,0,0,759,30,0,0,760,13,0,0,760,762,0,0,760,766,0,0,761,30,0,0,763,13,0,0,763,765,0,0,763,769,0,0,764,13,0,0,764,771,0,0,764,767,0,0,766,30,0,0,768,1096,0,0,768,329,0,0,768,777,0,0,769,30,0,0,770,4,0,0,771,30,0,0,772,13,0,0,772,774,0,0,772,776,0,0,773,784,1,501,773,778,1,502,773,817,0,0,775,788,0,0,775,329,0,0,775,1096,0,0,776,30,0,0,777,13,0,0,777,782,0,0,777,779,0,0,778,4,0,0,780,957,0,0,780,783,0,0,780,329,0,0,780,1,0,0,780,791,0,0,781,329,0,0,781,1096,0,0,781,792,0,0,782,30,0,0,783,35,0,0,784,329,0,0,784,797,0,0,784,1096,0,0,785,329,0,0,785,803,0,0,785,1096,0,0,786,795,0,0,786,957,0,0,786,790,0,0,786,1,0,0,786,329,0,0,787,1096,0,0,787,329,0,0,787,800,0,0,788,789,0,0,788,13,0,0,788,793,0,0,790,35,0,0,791,2,0,0,792,796,0,0,792,13,0,0,792,794,0,0,793,30,0,0,795,2,0,0,796,30,0,0,797,806,0,0,797,798,0,0,797,13,0,0,799,536,0,0,799,329,0,0,799,807,0,0,800,13,0,0,800,809,0,0,800,801,0,0,802,1,0,0,802,329,0,0,802,946,0,0,802,1096,0,0,803,805,0,0,803,13,0,0,803,804,0,0,805,30,0,0,806,30,0,0,807,10,0,0,808,1096,0,0,808,329,0,0,808,811,0,0,809,30,0,0,810,536,0,0,810,329,0,0,810,814,0,0,811,816,0,0,811,13,0,0,811,813,0,0,812,329,0,0,812,1096,0,0,812,824,0,0,814,10,0,0,815,1096,0,0,815,329,0,0,815,822,0,0,816,30,0,0,817,957,0,0,817,329,0,0,817,1,0,0,817,825,0,0,818,1096,0,0,818,848,0,0,818,329,0,0,819,832,0,0,819,1096,0,0,819,329,0,0,820,536,0,0,820,329,0,0,820,830,0,0,821,1096,0,0,821,329,0,0,821,835,0,0,822,13,0,0,822,828,0,0,822,826,0,0,823,329,0,0,823,838,0,0,823,1096,0,0,824,836,0,0,824,13,0,0,824,831,0,0,825,2,0,0,825,827,0,0,827,1,0,0,827,329,0,0,827,957,0,0,827,829,0,0,828,30,0,0,829,35,0,0,830,10,0,0,832,13,0,0,832,840,0,0,832,834,0,0,833,1096,0,0,833,843,0,0,833,329,0,0,835,13,0,0,835,847,0,0,835,837,0,0,836,30,0,0,838,13,0,0,838,844,0,0,838,841,0,0,839,842,0,0,839,536,0,0,839,329,0,0,840,30,0,0,842,10,0,0,843,13,0,0,843,851,0,0,843,845,0,0,844,30,0,0,846,1096,0,0,846,329,0,0,846,857,0,0,847,30,0,0,848,853,0,0,848,861,0,0,848,13,0,0,849,1096,0,0,849,329,0,0,849,860,0,0,850,536,0,0,850,329,0,0,850,854,0,0,851,30,0,0,852,1096,0,0,852,329,0,0,852,856,0,0,854,10,0,0,855,329,0,0,855,1096,0,0,855,865,0,0,856,13,0,0,856,862,0,0,856,858,0,0,857,869,0,0,857,13,0,0,857,859,0,0,860,13,0,0,860,867,0,0,860,864,0,0,861,30,0,0,862,30,0,0,863,879,0,0,865,13,0,0,865,872,0,0,865,868,0,0,866,877,0,0,866,1096,0,0,866,329,0,0,867,30,0,0,869,30,0,0,870,980,0,0,870,329,0,0,870,875,0,0,870,889,1,499,871,1087,0,0,871,873,0,0,872,30,0,0,873,890,0,0,873,329,0,0,873,884,0,0,874,952,0,0,874,1,0,0,874,329,0,0,875,876,0,0,875,13,0,0,875,883,0,0,877,878,0,0,877,13,0,0,877,881,0,0,879,1,0,0,879,329,0,0,879,950,0,0,879,885,0,0,880,1,0,0,880,2315,0,0,880,329,0,0,881,30,0,0,882,328,1,301,882,900,0,0,882,328,0,0,883,30,0,0,884,886,0,0,885,35,0,0,887,913,0,0,887,328,0,0,887,328,1,301,888,1096,0,0,888,329,0,0,888,892,0,0,889,934,1,503,889,961,0,0,889,914,1,504,889,893,1,501,890,1,0,0,890,329,0,0,891,536,0,0,891,898,0,0,891,329,0,0,892,13,0,0,892,897,0,0,892,894,0,0,893,329,0,0,893,1096,0,0,893,901,0,0,895,329,0,0,895,902,0,0,895,1096,0,0,896,329,0,0,896,536,0,0,896,899,0,0,897,30,0,0,898,10,0,0,899,10,0,0,900,329,0,0,900,946,0,0,900,910,0,0,900,1,0,0,901,13,0,0,901,905,0,0,901,903,0,0,902,13,0,0,902,908,0,0,902,904,0,0,905,30,0,0,906,915,0,0,906,1096,0,0,906,329,0,0,907,329,0,0,907,536,0,0,907,912,0,0,908,30,0,0,909,329,0,0,909,911,0,0,909,923,1,301,909,336,0,0,910,1,0,0,910,329,0,0,910,946,0,0,911,10,0,0,912,10,0,0,913,946,0,0,913,1,0,0,913,329,0,0,913,918,0,0,914,921,0,0,914,329,0,0,914,1096,0,0,915,917,0,0,915,916,0,0,915,13,0,0,917,30,0,0,918,1,0,0,918,329,0,0,918,946,0,0,919,1096,0,0,919,329,0,0,919,940,0,0,920,336,0,0,920,329,0,0,920,929,0,0,920,933,1,301,921,13,0,0,921,927,0,0,921,922,0,0,923,4,0,0,924,947,1,301,924,953,1,499,924,939,0,0,924,947,0,0,924,978,0,0,925,926,0,0,925,932,1,301,925,329,0,0,925,336,0,0,926,10,0,0,927,30,0,0,928,329,0,0,928,935,0,0,928,1096,0,0,929,10,0,0,930,1091,0,0,930,938,0,0,930,938,0,0,931,955,0,0,931,936,1,505,932,4,0,0,933,4,0,0,934,1096,0,0,934,329,0,0,934,945,0,0,935,13,0,0,935,941,0,0,935,937,0,0,936,1195,0,0,936,949,0,0,936,944,0,0,938,536,0,0,938,329,0,0,938,942,0,0,939,1,0,0,939,329,0,0,939,953,0,0,940,943,0,0,940,13,0,0,940,631,0,0,941,30,0,0,942,10,0,0,944,48,0,0,944,949,0,0,945,951,0,0,945,948,0,0,945,13,0,0,946,930,1,506,946,2212,1,300,946,930,1,507,946,928,1,508,946,1016,0,0,946,984,1,509,946,328,0,0,946,328,1,301,946,969,1,510,946,895,1,511,946,888,1,512,947,4,0,0,949,944,0,0,949,48,0,0,950,1071,1,513,950,1051,1,514,950,1035,1,515,950,1025,1,516,950,1000,1,517,950,920,1,518,950,985,1,519,950,959,1,510,950,1082,1,520,950,1157,0,0,950,1092,1,521,950,1106,1,522,950,2237,1,300,951,30,0,0,952,966,0,0,952,2315,1,300,952,328,1,523,952,954,1,301,953,963,0,0,953,956,1,502,953,924,1,300,954,4,0,0,955,1,0,0,955,958,0,0,955,329,0,0,956,4,0,0,957,988,0,0,957,962,1,524,958,329,0,0,958,1,0,0,959,960,0,0,959,329,0,0,959,964,1,301,959,336,0,0,960,10,0,0,961,965,0,0,961,957,0,0,961,329,0,0,961,1,0,0,962,329,0,0,962,1096,0,0,962,973,0,0,963,329,0,0,963,950,0,0,963,967,0,0,963,1,0,0,964,4,0,0,965,35,0,0,966,968,0,0,966,950,0,0,966,329,0,0,966,1,0,0,967,35,0,0,968,35,0,0,969,975,1,301,969,971,0,0,969,329,0,0,969,336,0,0,970,981,1,499,970,972,1,502,970,979,1,300,970,1017,0,0,971,10,0,0,972,4,0,0,973,974,0,0,973,13,0,0,973,976,0,0,975,4,0,0,976,30,0,0,977,906,1,525,977,1738,1,526,977,909,1,510,977,906,1,524,977,993,1,519,977,1009,1,527,977,2253,1,300,977,1812,0,0,977,1779,1,408,977,1024,1,528,977,1072,1,529,977,1105,1,530,977,1411,1,531,977,906,1,532,977,1768,1,533,977,1738,1,534,977,1711,1,535,977,1683,1,536,977,1655,1,537,977,1606,1,538,977,1565,1,539,977,1768,1,540,977,1711,1,541,977,1541,1,542,977,1121,1,543,977,1514,1,544,977,1133,1,545,977,1154,1,546,977,1494,1,547,977,1181,1,548,977,1474,1,549,977,1446,1,550,977,1424,1,551,977,1198,1,552,977,1382,1,553,977,1363,1,554,977,1222,1,555,977,1335,1,556,977,1312,1,557,977,1295,1,558,977,1256,1,559,978,1,0,0,978,982,0,0,978,946,0,0,978,329,0,0,979,970,1,499,979,983,1,301,979,994,0,0,979,983,0,0,980,329,0,0,980,1089,0,0,980,946,0,0,980,1,0,0,981,970,1,300,981,1006,0,0,981,986,1,502,982,35,0,0,983,4,0,0,984,1096,0,0,984,995,0,0,984,329,0,0,985,336,0,0,985,990,1,301,985,329,0,0,985,987,0,0,986,4,0,0,987,10,0,0,988,991,0,0,988,950,0,0,988,329,0,0,988,1,0,0,989,1005,1,300,989,992,1,502,989,1036,0,0,990,4,0,0,991,35,0,0,992,4,0,0,993,996,0,0,993,336,0,0,993,329,0,0,993,1002,1,301,994,998,0,0,994,2212,0,0,994,1,0,0,994,329,0,0,995,1001,0,0,995,13,0,0,995,997,0,0,996,10,0,0,998,35,0,0,999,1004,1,502,999,1023,1,300,999,1010,0,0,1000,329,0,0,1000,1003,0,0,1000,1007,1,301,1000,336,0,0,1001,30,0,0,1002,4,0,0,1003,10,0,0,1004,4,0,0,1005,1011,1,301,1005,1020,0,0,1005,989,1,499,1005,1011,0,0,1006,1,0,0,1006,329,0,0,1006,957,0,0,1006,1008,0,0,1007,4,0,0,1008,35,0,0,1009,329,0,0,1009,1096,0,0,1009,1013,0,0,1010,1,0,0,1010,329,0,0,1010,1012,0,0,1010,1015,0,0,1011,4,0,0,1012,1063,0,0,1012,1038,1,560,1013,13,0,0,1013,1019,0,0,1013,1014,0,0,1015,35,0,0,1016,1,0,0,1016,329,0,0,1016,950,0,0,1016,1043,0,0,1017,1,0,0,1017,329,0,0,1017,946,0,0,1017,1018,0,0,1018,35,0,0,1019,30,0,0,1020,1,0,0,1020,329,0,0,1020,2212,0,0,1020,1031,0,0,1021,1094,0,0,1021,1039,0,0,1021,1039,1,301,1021,1047,1,499,1021,1028,0,0,1022,329,0,0,1022,1,0,0,1023,999,1,499,1023,1032,1,300,1023,1026,1,502,1023,1052,0,0,1024,1049,0,0,1024,1096,0,0,1024,329,0,0,1025,1027,0,0,1025,336,0,0,1025,329,0,0,1025,1030,1,301,1026,4,0,0,1027,10,0,0,1028,1,0,0,1028,329,0,0,1028,1047,0,0,1029,1,0,0,1029,329,0,0,1030,4,0,0,1031,35,0,0,1032,1034,1,301,1032,1023,1,499,1032,1042,0,0,1032,1034,0,0,1033,1,0,0,1033,329,0,0,1033,950,0,0,1034,4,0,0,1035,1040,1,301,1035,336,0,0,1035,1037,0,0,1035,329,0,0,1036,1041,0,0,1036,946,0,0,1036,1,0,0,1036,329,0,0,1037,10,0,0,1038,1096,0,0,1038,1044,0,0,1038,329,0,0,1039,4,0,0,1040,4,0,0,1041,35,0,0,1042,1045,0,0,1042,2212,0,0,1042,329,0,0,1042,1,0,0,1043,35,0,0,1044,13,0,0,1044,1050,0,0,1044,1048,0,0,1045,35,0,0,1046,1,0,0,1046,329,0,0,1046,950,0,0,1047,1085,0,0,1047,1055,1,561,1047,1069,1,502,1047,1021,1,300,1049,1057,0,0,1049,1062,0,0,1049,13,0,0,1050,30,0,0,1051,336,0,0,1051,1061,1,301,1051,329,0,0,1051,1054,0,0,1052,1056,0,0,1052,1,0,0,1052,329,0,0,1052,946,0,0,1053,1,0,0,1053,1067,0,0,1053,329,0,0,1053,950,0,0,1054,10,0,0,1055,336,0,0,1055,1064,1,301,1055,1059,0,0,1055,329,0,0,1056,35,0,0,1058,977,0,0,1058,329,0,0,1058,1,0,0,1059,10,0,0,1060,950,0,0,1060,329,0,0,1060,1,0,0,1061,4,0,0,1062,30,0,0,1063,1,0,0,1063,329,0,0,1063,950,0,0,1063,1065,0,0,1064,4,0,0,1065,35,0,0,1066,977,0,0,1066,329,0,0,1066,1,0,0,1067,1,0,0,1067,329,0,0,1067,950,0,0,1068,329,0,0,1068,977,0,0,1068,1,0,0,1069,4,0,0,1070,329,0,0,1070,1,0,0,1070,977,0,0,1071,336,0,0,1071,1075,1,301,1071,329,0,0,1071,1073,0,0,1072,336,0,0,1072,1086,1,301,1072,329,0,0,1072,1081,0,0,1073,10,0,0,1074,1,0,0,1074,329,0,0,1074,977,0,0,1075,4,0,0,1076,977,0,0,1076,1,0,0,1076,329,0,0,1077,1,0,0,1077,329,0,0,1078,329,0,0,1078,977,0,0,1078,1,0,0,1079,329,0,0,1079,977,0,0,1079,1,0,0,1080,1,0,0,1080,329,0,0,1080,952,0,0,1081,10,0,0,1082,329,0,0,1082,1088,1,301,1082,336,0,0,1082,1084,0,0,1083,1,0,0,1083,329,0,0,1083,977,0,0,1084,10,0,0,1085,950,0,0,1085,329,0,0,1085,1,0,0,1085,1090,0,0,1086,4,0,0,1087,1,0,0,1087,329,0,0,1088,4,0,0,1089,946,0,0,1089,329,0,0,1089,1,0,0,1090,35,0,0,1091,329,0,0,1091,1,0,0,1092,329,0,0,1092,1100,1,301,1092,1098,0,0,1092,336,0,0,1093,946,0,0,1093,1,0,0,1093,329,0,0,1094,1097,0,0,1094,1,0,0,1094,329,0,0,1094,946,0,0,1095,1135,0,0,1095,329,0,0,1095,1,0,0,1096,946,0,0,1096,1,0,0,1096,329,0,0,1097,35,0,0,1098,10,0,0,1099,329,0,0,1099,1,0,0,1099,970,0,0,1100,4,0,0,1101,989,0,0,1101,329,0,0,1101,1,0,0,1102,1023,0,0,1102,329,0,0,1102,1,0,0,1103,950,0,0,1103,1115,0,0,1103,329,0,0,1103,1,0,0,1104,977,0,0,1104,329,0,0,1104,1,0,0,1104,1113,0,0,1105,329,0,0,1105,336,0,0,1105,1107,0,0,1105,1112,1,301,1106,1091,0,0,1106,1142,0,0,1106,1123,0,0,1107,10,0,0,1108,1116,0,0,1108,1170,0,0,1108,1114,0,0,1108,1116,1,301,1108,1122,1,499,1109,1131,0,0,1109,1,0,0,1109,329,0,0,1110,1,0,0,1110,329,0,0,1111,1,0,0,1111,329,0,0,1111,1104,0,0,1111,977,0,0,1112,4,0,0,1113,1066,0,0,1113,977,0,0,1113,1,0,0,1113,329,0,0,1114,1,0,0,1114,1122,0,0,1114,329,0,0,1115,950,0,0,1115,329,0,0,1115,1,0,0,1115,1060,0,0,1116,4,0,0,1117,329,0,0,1117,1,0,0,1118,329,0,0,1118,1,0,0,1119,329,0,0,1119,1,0,0,1120,946,0,0,1120,329,0,0,1120,1,0,0,1121,329,0,0,1121,1124,0,0,1121,1127,1,301,1121,336,0,0,1122,1163,0,0,1122,1108,1,300,1122,1144,1,502,1122,1134,1,561,1123,329,0,0,1123,336,0,0,1123,1126,0,0,1123,1129,1,301,1124,10,0,0,1125,1,0,0,1125,329,0,0,1125,1128,0,0,1126,10,0,0,1127,4,0,0,1128,2257,1,300,1128,1140,1,555,1128,1156,1,502,1128,1165,1,562,1128,1189,0,0,1129,4,0,0,1130,1151,0,0,1130,329,0,0,1130,1,0,0,1131,1290,1,563,1131,1219,1,564,1131,1149,1,565,1131,1509,1,566,1131,2216,1,300,1131,1340,1,567,1131,1315,1,568,1131,1132,0,0,1131,1605,1,569,1131,1246,1,570,1131,1306,1,571,1131,1427,1,572,1131,1477,1,573,1131,1453,1,574,1131,1394,1,575,1131,1369,1,576,1131,1373,0,0,1131,1337,1,577,1131,1196,1,510,1132,16,0,0,1133,1137,0,0,1133,336,0,0,1133,1143,1,301,1133,329,0,0,1134,1141,1,301,1134,336,0,0,1134,329,0,0,1134,1138,0,0,1135,1182,0,0,1135,1161,1,578,1135,1139,1,502,1135,2354,1,300,1136,925,1,510,1136,1147,1,519,1136,1171,0,0,1136,2336,1,300,1137,10,0,0,1138,10,0,0,1139,4,0,0,1140,1148,1,301,1140,1146,0,0,1140,329,0,0,1140,336,0,0,1141,4,0,0,1142,1150,1,301,1142,1145,0,0,1142,329,0,0,1142,336,0,0,1143,4,0,0,1144,4,0,0,1145,10,0,0,1146,10,0,0,1147,1153,0,0,1147,329,0,0,1147,1096,0,0,1148,4,0,0,1149,1167,1,301,1149,1152,0,0,1149,329,0,0,1149,336,0,0,1150,4,0,0,1151,1439,1,579,1151,1169,1,510,1151,1726,0,0,1151,328,0,0,1151,1661,1,580,1151,1187,1,518,1151,1213,1,581,1151,1239,1,582,1151,1253,1,583,1151,1270,1,553,1151,1291,1,531,1151,1308,1,584,1151,1326,1,585,1151,1339,1,555,1151,1362,1,586,1151,1374,1,587,1151,1401,1,588,1151,1422,1,589,1151,1469,1,590,1151,1496,1,591,1151,1515,1,592,1151,1528,1,593,1151,1557,1,594,1151,1571,1,537,1151,1601,1,595,1151,1627,1,596,1151,1640,1,597,1151,1640,1,598,1151,1661,1,599,1151,1698,1,524,1151,2349,1,300,1152,10,0,0,1153,13,0,0,1153,1155,0,0,1153,1159,0,0,1154,1164,1,301,1154,336,0,0,1154,1158,0,0,1154,329,0,0,1156,4,0,0,1157,1,0,0,1157,329,0,0,1157,1160,0,0,1158,10,0,0,1159,30,0,0,1160,35,0,0,1161,1162,0,0,1161,336,0,0,1161,1166,1,301,1161,329,0,0,1162,10,0,0,1163,950,0,0,1163,1168,0,0,1163,1,0,0,1163,329,0,0,1164,4,0,0,1165,1091,0,0,1165,887,0,0,1165,1172,0,0,1166,4,0,0,1167,4,0,0,1168,35,0,0,1169,1173,0,0,1169,329,0,0,1169,336,0,0,1169,1177,1,301,1170,1,0,0,1170,329,0,0,1170,946,0,0,1170,1174,0,0,1171,950,0,0,1171,1175,0,0,1171,329,0,0,1171,1,0,0,1171,1179,0,0,1172,336,0,0,1172,1180,1,301,1172,1176,0,0,1172,329,0,0,1173,10,0,0,1174,35,0,0,1175,35,0,0,1176,10,0,0,1177,4,0,0,1178,1136,0,0,1178,1,0,0,1178,329,0,0,1179,2,0,0,1180,4,0,0,1181,1183,0,0,1181,329,0,0,1181,336,0,0,1181,1190,1,301,1182,950,0,0,1182,329,0,0,1182,1,0,0,1182,1186,0,0,1183,10,0,0,1184,1199,0,0,1184,2318,1,300,1185,1243,0,0,1185,1197,1,301,1185,1194,0,0,1185,1204,1,499,1185,1197,0,0,1186,35,0,0,1187,336,0,0,1187,1191,0,0,1187,329,0,0,1187,1193,1,301,1188,1184,0,0,1188,329,0,0,1188,1,0,0,1189,1192,0,0,1189,950,0,0,1189,329,0,0,1189,1,0,0,1190,4,0,0,1191,10,0,0,1192,35,0,0,1193,4,0,0,1194,329,0,0,1194,1,0,0,1194,1204,0,0,1195,1200,0,0,1195,1,0,0,1195,329,0,0,1196,1202,0,0,1196,1206,1,301,1196,336,0,0,1196,329,0,0,1197,4,0,0,1198,1203,0,0,1198,336,0,0,1198,329,0,0,1198,1211,1,301,1199,329,0,0,1199,1,0,0,1199,950,0,0,1199,1201,0,0,1200,1273,1,600,1200,2306,1,300,1200,1404,1,601,1200,1397,1,502,1200,1376,1,524,1200,1376,1,541,1200,1338,1,602,1200,1448,0,0,1200,1314,1,603,1200,1299,1,604,1200,1209,1,418,1200,1229,1,605,1200,1252,1,606,1201,35,0,0,1202,10,0,0,1203,10,0,0,1204,1208,1,502,1204,1185,1,300,1204,1224,0,0,1205,1336,1,524,1205,2304,1,300,1205,1372,1,601,1205,1421,0,0,1205,1358,1,502,1205,1215,1,607,1205,1238,1,418,1205,1258,1,605,1205,1283,1,600,1205,1298,1,608,1205,1309,1,609,1205,1336,1,525,1205,1336,1,540,1206,4,0,0,1207,1,0,0,1207,329,0,0,1207,1205,0,0,1208,4,0,0,1209,1217,1,301,1209,336,0,0,1209,329,0,0,1209,1212,0,0,1210,1214,1,502,1210,1251,0,0,1210,2314,1,300,1210,1223,1,610,1211,4,0,0,1212,10,0,0,1213,329,0,0,1213,1225,1,301,1213,336,0,0,1213,1221,0,0,1214,4,0,0,1215,1216,0,0,1215,336,0,0,1215,329,0,0,1215,1220,1,301,1216,10,0,0,1217,4,0,0,1218,329,0,0,1218,1,0,0,1218,1210,0,0,1219,1091,0,0,1219,887,0,0,1219,1228,0,0,1220,4,0,0,1221,10,0,0,1222,1234,0,0,1222,1237,1,301,1222,329,0,0,1222,336,0,0,1223,1232,0,0,1223,329,0,0,1223,1096,0,0,1224,1227,0,0,1224,1,0,0,1224,329,0,0,1224,950,0,0,1225,4,0,0,1226,714,1,300,1226,1230,1,502,1226,1249,0,0,1227,35,0,0,1228,1231,0,0,1228,1235,1,301,1228,336,0,0,1228,329,0,0,1229,1242,1,301,1229,329,0,0,1229,336,0,0,1229,1240,0,0,1230,4,0,0,1231,10,0,0,1232,13,0,0,1232,1236,0,0,1232,1233,0,0,1234,10,0,0,1235,4,0,0,1236,30,0,0,1237,4,0,0,1238,1244,0,0,1238,329,0,0,1238,1248,1,301,1238,336,0,0,1239,336,0,0,1239,1245,1,301,1239,329,0,0,1239,1241,0,0,1240,10,0,0,1241,10,0,0,1242,4,0,0,1243,946,0,0,1243,1,0,0,1243,1247,0,0,1243,329,0,0,1244,10,0,0,1245,4,0,0,1246,1096,0,0,1246,329,0,0,1246,1262,0,0,1247,35,0,0,1248,4,0,0,1249,329,0,0,1249,950,0,0,1249,1,0,0,1249,1250,0,0,1250,35,0,0,1251,1,0,0,1251,329,0,0,1251,950,0,0,1251,1254,0,0,1252,1260,1,301,1252,1257,0,0,1252,336,0,0,1252,329,0,0,1253,1259,0,0,1253,1264,1,301,1253,329,0,0,1253,336,0,0,1254,35,0,0,1255,1,0,0,1255,329,0,0,1255,1226,0,0,1256,1096,0,0,1256,329,0,0,1256,1274,0,0,1257,10,0,0,1258,1269,1,301,1258,336,0,0,1258,329,0,0,1258,1261,0,0,1259,10,0,0,1260,4,0,0,1261,10,0,0,1262,1263,0,0,1262,1277,0,0,1262,13,0,0,1264,4,0,0,1265,1267,1,502,1265,1319,0,0,1265,1272,1,501,1266,1,0,0,1266,329,0,0,1266,1265,0,0,1267,4,0,0,1268,1,0,0,1268,329,0,0,1268,1280,0,0,1268,1271,0,0,1269,4,0,0,1270,336,0,0,1270,329,0,0,1270,1275,0,0,1270,1279,1,301,1271,35,0,0,1272,1096,0,0,1272,329,0,0,1272,1284,0,0,1273,1285,1,301,1273,329,0,0,1273,1282,0,0,1273,336,0,0,1274,13,0,0,1274,1288,0,0,1274,1276,0,0,1275,10,0,0,1277,30,0,0,1278,1281,0,0,1278,536,0,0,1278,329,0,0,1279,4,0,0,1280,1307,0,0,1281,10,0,0,1282,10,0,0,1283,1287,0,0,1283,1289,1,301,1283,329,0,0,1283,336,0,0,1284,1286,0,0,1284,1311,0,0,1284,13,0,0,1285,4,0,0,1287,10,0,0,1288,30,0,0,1289,4,0,0,1290,1096,0,0,1290,1292,0,0,1290,329,0,0,1291,336,0,0,1291,1293,0,0,1291,1296,1,301,1291,329,0,0,1292,13,0,0,1292,1297,0,0,1292,1294,0,0,1293,10,0,0,1295,336,0,0,1295,329,0,0,1295,1300,0,0,1295,1303,1,301,1296,4,0,0,1297,30,0,0,1298,329,0,0,1298,1301,0,0,1298,1304,1,301,1298,336,0,0,1299,1302,0,0,1299,336,0,0,1299,329,0,0,1299,1305,1,301,1300,10,0,0,1301,10,0,0,1302,10,0,0,1303,4,0,0,1304,4,0,0,1305,4,0,0,1306,1321,0,0,1306,1091,0,0,1306,887,0,0,1307,1,0,0,1307,329,0,0,1307,950,0,0,1308,336,0,0,1308,329,0,0,1308,1310,0,0,1308,1313,1,301,1309,336,0,0,1309,329,0,0,1309,1329,1,301,1309,1325,0,0,1310,10,0,0,1311,30,0,0,1312,336,0,0,1312,1317,0,0,1312,329,0,0,1312,1318,1,301,1313,4,0,0,1314,329,0,0,1314,1320,1,301,1314,336,0,0,1314,1316,0,0,1315,1096,0,0,1315,1324,0,0,1315,329,0,0,1316,10,0,0,1317,10,0,0,1318,4,0,0,1319,1332,0,0,1319,1,0,0,1319,329,0,0,1319,957,0,0,1320,4,0,0,1321,1328,1,301,1321,336,0,0,1321,329,0,0,1321,1323,0,0,1322,1,0,0,1322,950,0,0,1322,329,0,0,1323,10,0,0,1324,1334,0,0,1324,1327,0,0,1324,13,0,0,1325,10,0,0,1326,336,0,0,1326,1333,1,301,1326,329,0,0,1326,1330,0,0,1328,4,0,0,1329,4,0,0,1330,10,0,0,1331,946,0,0,1331,329,0,0,1331,1,0,0,1332,1351,0,0,1332,2,0,0,1333,4,0,0,1334,30,0,0,1335,1096,0,0,1335,1343,0,0,1335,329,0,0,1336,1096,0,0,1336,1341,0,0,1336,329,0,0,1337,887,0,0,1337,1348,0,0,1337,1091,0,0,1338,336,0,0,1338,1360,1,301,1338,329,0,0,1338,1352,0,0,1339,1346,1,301,1339,336,0,0,1339,329,0,0,1339,1342,0,0,1340,1096,0,0,1340,1354,0,0,1340,329,0,0,1341,1344,0,0,1341,13,0,0,1341,1350,0,0,1342,10,0,0,1343,13,0,0,1343,1345,0,0,1343,1349,0,0,1346,4,0,0,1347,329,0,0,1347,1,0,0,1347,946,0,0,1348,1353,0,0,1348,329,0,0,1348,1357,1,301,1348,336,0,0,1349,30,0,0,1350,30,0,0,1351,957,0,0,1351,1,0,0,1351,1361,0,0,1351,329,0,0,1352,10,0,0,1353,10,0,0,1354,1359,0,0,1354,1355,0,0,1354,13,0,0,1356,1,0,0,1356,329,0,0,1357,4,0,0,1358,4,0,0,1359,30,0,0,1360,4,0,0,1361,35,0,0,1362,329,0,0,1362,1366,1,301,1362,1364,0,0,1362,336,0,0,1363,1096,0,0,1363,1367,0,0,1363,329,0,0,1364,10,0,0,1365,1378,1,300,1365,1409,0,0,1366,4,0,0,1367,1368,0,0,1367,1370,0,0,1367,13,0,0,1369,1377,0,0,1369,887,0,0,1369,1091,0,0,1370,30,0,0,1371,1,0,0,1371,329,0,0,1371,1365,0,0,1372,887,0,0,1372,1091,0,0,1372,1385,0,0,1373,950,0,0,1373,1375,0,0,1373,1,0,0,1373,329,0,0,1374,336,0,0,1374,329,0,0,1374,1390,1,301,1374,1381,0,0,1375,35,0,0,1376,1096,0,0,1376,329,0,0,1376,1387,0,0,1377,329,0,0,1377,1380,0,0,1377,1384,1,301,1377,336,0,0,1378,1399,0,0,1378,1383,0,0,1378,1383,1,301,1378,1365,1,499,1379,1420,0,0,1379,1391,1,300,1380,10,0,0,1381,10,0,0,1382,1393,0,0,1382,1398,1,301,1382,329,0,0,1382,336,0,0,1383,4,0,0,1384,4,0,0,1385,336,0,0,1385,1400,1,301,1385,329,0,0,1385,1388,0,0,1386,1,0,0,1386,329,0,0,1386,1379,0,0,1387,1392,0,0,1387,13,0,0,1387,1389,0,0,1388,10,0,0,1390,4,0,0,1391,1379,1,499,1391,1396,1,301,1391,1396,0,0,1391,1408,0,0,1392,30,0,0,1393,10,0,0,1394,1091,0,0,1394,1407,0,0,1394,887,0,0,1395,1430,0,0,1395,1403,1,300,1396,4,0,0,1397,4,0,0,1398,4,0,0,1399,329,0,0,1399,1,0,0,1399,946,0,0,1399,1402,0,0,1400,4,0,0,1401,1405,0,0,1401,329,0,0,1401,1410,1,301,1401,336,0,0,1402,35,0,0,1403,1395,1,499,1403,1416,0,0,1403,1406,1,301,1403,1406,0,0,1404,1091,0,0,1404,1432,0,0,1404,887,0,0,1405,10,0,0,1406,4,0,0,1407,336,0,0,1407,1414,1,301,1407,329,0,0,1407,1413,0,0,1408,1,0,0,1408,329,0,0,1408,946,0,0,1408,1412,0,0,1409,1,0,0,1409,329,0,0,1409,952,0,0,1409,1415,0,0,1410,4,0,0,1411,1419,1,301,1411,1417,0,0,1411,329,0,0,1411,336,0,0,1412,35,0,0,1413,10,0,0,1414,4,0,0,1415,35,0,0,1416,1,0,0,1416,1418,0,0,1416,946,0,0,1416,329,0,0,1417,10,0,0,1418,35,0,0,1419,4,0,0,1420,1,0,0,1420,1426,0,0,1420,329,0,0,1420,950,0,0,1421,329,0,0,1421,950,0,0,1421,1431,0,0,1421,1,0,0,1421,1423,0,0,1422,1428,1,301,1422,336,0,0,1422,329,0,0,1422,1425,0,0,1423,35,0,0,1424,1096,0,0,1424,1433,0,0,1424,329,0,0,1425,10,0,0,1426,35,0,0,1427,1440,0,0,1427,1091,0,0,1427,887,0,0,1428,4,0,0,1429,1395,0,0,1429,1,0,0,1429,329,0,0,1430,952,0,0,1430,329,0,0,1430,1,0,0,1430,1435,0,0,1431,2,0,0,1432,336,0,0,1432,1437,0,0,1432,1441,1,301,1432,329,0,0,1433,13,0,0,1433,1438,0,0,1433,1436,0,0,1434,1475,0,0,1434,1442,1,300,1435,35,0,0,1437,10,0,0,1438,30,0,0,1439,1454,0,0,1439,329,0,0,1439,1096,0,0,1440,1443,0,0,1440,336,0,0,1440,1444,1,301,1440,329,0,0,1441,4,0,0,1442,1459,0,0,1442,1447,0,0,1442,1434,1,499,1442,1447,1,301,1443,10,0,0,1444,4,0,0,1445,1497,0,0,1445,1462,1,300,1446,1096,0,0,1446,329,0,0,1446,1451,0,0,1447,4,0,0,1448,1,0,0,1448,329,0,0,1448,950,0,0,1448,1455,0,0,1448,1450,0,0,1449,1,0,0,1449,329,0,0,1449,1434,0,0,1450,35,0,0,1451,13,0,0,1451,1460,0,0,1451,1452,0,0,1453,1091,0,0,1453,1464,0,0,1453,887,0,0,1454,13,0,0,1454,1461,0,0,1454,1456,0,0,1455,2,0,0,1457,1445,0,0,1457,1,0,0,1457,329,0,0,1458,1470,1,300,1458,1504,0,0,1459,329,0,0,1459,946,0,0,1459,1,0,0,1459,1463,0,0,1460,30,0,0,1461,30,0,0,1462,1465,0,0,1462,1445,1,499,1462,1465,1,301,1462,1473,0,0,1463,35,0,0,1464,336,0,0,1464,329,0,0,1464,1466,0,0,1464,1468,1,301,1465,4,0,0,1466,10,0,0,1467,1481,1,300,1467,1505,0,0,1468,4,0,0,1469,1472,0,0,1469,329,0,0,1469,1479,1,301,1469,336,0,0,1470,1471,0,0,1470,1478,0,0,1470,1458,1,499,1470,1471,1,301,1471,4,0,0,1472,10,0,0,1473,329,0,0,1473,946,0,0,1473,1488,0,0,1473,1,0,0,1474,1096,0,0,1474,329,0,0,1474,1486,0,0,1475,950,0,0,1475,329,0,0,1475,1476,0,0,1475,1,0,0,1476,35,0,0,1477,1091,0,0,1477,1485,0,0,1477,887,0,0,1478,1,0,0,1478,329,0,0,1478,946,0,0,1478,1482,0,0,1479,4,0,0,1480,329,0,0,1480,1458,0,0,1480,1,0,0,1481,1484,1,301,1481,1467,1,499,1481,1484,0,0,1481,1492,0,0,1482,35,0,0,1483,329,0,0,1483,1467,0,0,1483,1,0,0,1484,4,0,0,1485,329,0,0,1485,1491,0,0,1485,1498,1,301,1485,336,0,0,1486,1487,0,0,1486,1489,0,0,1486,13,0,0,1488,35,0,0,1489,30,0,0,1490,1,0,0,1490,329,0,0,1490,1495,0,0,1491,10,0,0,1492,329,0,0,1492,1,0,0,1492,946,0,0,1492,1493,0,0,1493,35,0,0,1494,1500,0,0,1494,329,0,0,1494,1096,0,0,1495,1499,1,300,1495,1517,0,0,1496,1506,1,301,1496,1502,0,0,1496,336,0,0,1496,329,0,0,1497,329,0,0,1497,1,0,0,1497,950,0,0,1497,1501,0,0,1498,4,0,0,1499,6,0,0,1500,13,0,0,1500,1507,0,0,1500,1503,0,0,1501,35,0,0,1502,10,0,0,1504,1,0,0,1504,329,0,0,1504,952,0,0,1504,1510,0,0,1505,1,0,0,1505,329,0,0,1505,950,0,0,1505,1508,0,0,1506,4,0,0,1507,30,0,0,1508,35,0,0,1509,1513,1,301,1509,336,0,0,1509,329,0,0,1509,1512,0,0,1510,35,0,0,1511,1518,0,0,1511,1091,0,0,1511,887,0,0,1512,10,0,0,1513,4,0,0,1514,1096,0,0,1514,329,0,0,1514,1524,0,0,1515,336,0,0,1515,1519,1,301,1515,329,0,0,1515,1516,0,0,1516,10,0,0,1517,329,0,0,1517,1,0,0,1517,347,0,0,1517,1520,0,0,1518,1089,0,0,1518,329,0,0,1518,1537,0,0,1519,4,0,0,1520,35,0,0,1521,1,0,0,1521,329,0,0,1521,1554,0,0,1522,1523,0,0,1522,336,0,0,1522,329,0,0,1522,1529,1,301,1523,10,0,0,1524,13,0,0,1524,1533,0,0,1524,1526,0,0,1525,1,0,0,1525,329,0,0,1525,1554,0,0,1525,1532,0,0,1527,329,0,0,1527,536,0,0,1527,1535,0,0,1528,1534,1,301,1528,336,0,0,1528,329,0,0,1528,1530,0,0,1529,4,0,0,1530,10,0,0,1531,329,0,0,1531,336,0,0,1531,1536,0,0,1531,1539,1,301,1532,35,0,0,1533,30,0,0,1534,4,0,0,1535,10,0,0,1536,10,0,0,1537,1540,0,0,1537,1538,0,0,1537,13,0,0,1539,4,0,0,1540,30,0,0,1541,1096,0,0,1541,329,0,0,1541,1546,0,0,1542,536,0,0,1542,329,0,0,1542,1547,0,0,1543,1550,1,301,1543,329,0,0,1543,1544,0,0,1543,336,0,0,1544,10,0,0,1545,1556,1,301,1545,329,0,0,1545,336,0,0,1545,1551,0,0,1546,13,0,0,1546,1552,0,0,1546,1548,0,0,1547,10,0,0,1549,1562,0,0,1549,329,0,0,1549,336,0,0,1549,1567,1,301,1550,4,0,0,1551,10,0,0,1552,30,0,0,1553,1558,1,301,1553,329,0,0,1553,1555,0,0,1553,336,0,0,1554,1634,1,611,1554,1656,1,595,1554,1685,1,612,1554,1703,1,613,1554,1729,1,614,1554,1748,1,615,1554,1771,1,616,1554,1781,1,617,1554,1790,1,618,1554,1797,1,619,1554,1805,1,620,1554,1609,1,621,1554,1596,1,622,1554,1820,1,623,1554,1827,1,624,1554,1593,1,625,1554,1589,1,626,1554,1587,1,627,1554,1585,1,628,1554,1583,1,629,1554,1581,1,630,1554,1811,1,631,1554,1577,1,632,1554,1573,1,633,1554,1570,1,634,1554,1568,1,635,1554,1566,1,636,1554,1616,1,637,1554,1610,1,638,1554,1564,1,300,1554,1832,0,0,1555,10,0,0,1556,4,0,0,1557,329,0,0,1557,336,0,0,1557,1560,0,0,1557,1563,1,301,1558,4,0,0,1559,536,0,0,1559,329,0,0,1559,1561,0,0,1560,10,0,0,1561,10,0,0,1562,10,0,0,1563,4,0,0,1564,6,0,0,1565,1096,0,0,1565,329,0,0,1565,1582,0,0,1566,7,0,0,1567,4,0,0,1568,7,0,0,1569,1575,0,0,1569,329,0,0,1569,336,0,0,1569,1579,1,301,1570,7,0,0,1571,336,0,0,1571,1590,1,301,1571,329,0,0,1571,1586,0,0,1572,329,0,0,1572,336,0,0,1572,1576,0,0,1572,1580,1,301,1573,7,0,0,1574,536,0,0,1574,329,0,0,1574,1578,0,0,1575,10,0,0,1576,10,0,0,1577,7,0,0,1578,10,0,0,1579,4,0,0,1580,4,0,0,1581,7,0,0,1582,1584,0,0,1582,1595,0,0,1582,13,0,0,1583,7,0,0,1585,7,0,0,1586,10,0,0,1587,7,0,0,1588,1591,0,0,1588,329,0,0,1588,1598,1,301,1588,336,0,0,1589,7,0,0,1590,4,0,0,1591,10,0,0,1592,1594,0,0,1592,329,0,0,1592,336,0,0,1592,1600,1,301,1593,7,0,0,1594,10,0,0,1595,30,0,0,1596,7,0,0,1597,1602,1,301,1597,1599,0,0,1597,329,0,0,1597,336,0,0,1598,4,0,0,1599,10,0,0,1600,4,0,0,1601,1603,0,0,1601,329,0,0,1601,336,0,0,1601,1607,1,301,1602,4,0,0,1603,10,0,0,1604,1608,0,0,1604,329,0,0,1604,1620,1,301,1604,336,0,0,1605,1096,0,0,1605,1611,0,0,1605,329,0,0,1606,1622,0,0,1606,329,0,0,1606,1096,0,0,1607,4,0,0,1608,10,0,0,1609,7,0,0,1610,7,0,0,1611,1631,0,0,1611,1613,0,0,1611,13,0,0,1612,1636,1,301,1612,329,0,0,1612,336,0,0,1612,1633,0,0,1614,336,0,0,1614,1617,1,301,1614,329,0,0,1614,1615,0,0,1615,10,0,0,1616,1623,1,301,1616,336,0,0,1616,1619,0,0,1616,329,0,0,1617,4,0,0,1618,1621,0,0,1618,336,0,0,1618,1624,1,301,1618,329,0,0,1619,10,0,0,1620,4,0,0,1621,10,0,0,1622,13,0,0,1622,1625,0,0,1622,1635,0,0,1623,4,0,0,1624,4,0,0,1626,1628,0,0,1626,1630,1,301,1626,329,0,0,1626,336,0,0,1627,1632,1,301,1627,1629,0,0,1627,336,0,0,1627,329,0,0,1628,10,0,0,1629,10,0,0,1630,4,0,0,1631,30,0,0,1632,4,0,0,1633,10,0,0,1634,336,0,0,1634,329,0,0,1634,1644,1,301,1634,1639,0,0,1635,30,0,0,1636,4,0,0,1637,1645,1,301,1637,336,0,0,1637,329,0,0,1637,1638,0,0,1638,10,0,0,1639,10,0,0,1640,336,0,0,1640,1648,1,301,1640,1642,0,0,1640,329,0,0,1641,1646,0,0,1641,336,0,0,1641,329,0,0,1641,1651,1,301,1642,10,0,0,1643,336,0,0,1643,1647,0,0,1643,329,0,0,1643,1650,1,301,1644,4,0,0,1645,4,0,0,1646,10,0,0,1647,10,0,0,1648,4,0,0,1649,1653,0,0,1649,329,0,0,1649,536,0,0,1650,4,0,0,1651,4,0,0,1652,1657,1,301,1652,329,0,0,1652,336,0,0,1652,1654,0,0,1653,10,0,0,1654,10,0,0,1655,1660,0,0,1655,1096,0,0,1655,329,0,0,1656,336,0,0,1656,329,0,0,1656,1677,1,301,1656,1664,0,0,1657,4,0,0,1658,336,0,0,1658,329,0,0,1658,1665,0,0,1658,1670,1,301,1659,329,0,0,1659,336,0,0,1659,1669,1,301,1659,1666,0,0,1660,13,0,0,1660,1674,0,0,1660,1662,0,0,1661,1673,0,0,1661,336,0,0,1661,329,0,0,1661,1679,1,301,1663,336,0,0,1663,1676,1,301,1663,329,0,0,1663,1667,0,0,1664,10,0,0,1665,10,0,0,1666,10,0,0,1667,10,0,0,1668,1672,0,0,1668,536,0,0,1668,329,0,0,1669,4,0,0,1670,4,0,0,1671,336,0,0,1671,329,0,0,1671,1675,0,0,1671,1678,1,301,1672,10,0,0,1673,10,0,0,1674,30,0,0,1675,10,0,0,1676,4,0,0,1677,4,0,0,1678,4,0,0,1679,4,0,0,1680,1684,0,0,1680,536,0,0,1680,329,0,0,1681,1687,0,0,1681,1690,1,301,1681,336,0,0,1681,329,0,0,1682,1686,0,0,1682,1688,1,301,1682,336,0,0,1682,329,0,0,1683,329,0,0,1683,1096,0,0,1683,1691,0,0,1684,10,0,0,1685,1692,0,0,1685,329,0,0,1685,1695,1,301,1685,336,0,0,1686,10,0,0,1687,10,0,0,1688,4,0,0,1689,1701,1,301,1689,329,0,0,1689,336,0,0,1689,1697,0,0,1690,4,0,0,1691,13,0,0,1691,1700,0,0,1691,1693,0,0,1692,10,0,0,1694,1696,0,0,1694,1699,1,301,1694,329,0,0,1694,336,0,0,1695,4,0,0,1696,10,0,0,1697,10,0,0,1698,329,0,0,1698,336,0,0,1698,1702,0,0,1698,1710,1,301,1699,4,0,0,1700,30,0,0,1701,4,0,0,1702,10,0,0,1703,1716,1,301,1703,336,0,0,1703,329,0,0,1703,1706,0,0,1704,536,0,0,1704,329,0,0,1704,1707,0,0,1705,336,0,0,1705,1712,1,301,1705,329,0,0,1705,1708,0,0,1706,10,0,0,1707,10,0,0,1708,10,0,0,1709,1718,1,301,1709,329,0,0,1709,336,0,0,1709,1715,0,0,1710,4,0,0,1711,1096,0,0,1711,329,0,0,1711,1719,0,0,1712,4,0,0,1713,1725,1,301,1713,336,0,0,1713,329,0,0,1713,1722,0,0,1714,1727,1,301,1714,336,0,0,1714,329,0,0,1714,1717,0,0,1715,10,0,0,1716,4,0,0,1717,10,0,0,1718,4,0,0,1719,1721,0,0,1719,13,0,0,1719,1724,0,0,1720,536,0,0,1720,1723,0,0,1720,329,0,0,1722,10,0,0,1723,10,0,0,1724,30,0,0,1725,4,0,0,1726,1,0,0,1726,329,0,0,1726,950,0,0,1726,1731,0,0,1726,1728,0,0,1727,4,0,0,1728,35,0,0,1729,1730,0,0,1729,329,0,0,1729,1732,1,301,1729,336,0,0,1730,10,0,0,1731,2,0,0,1732,4,0,0,1733,329,0,0,1733,536,0,0,1733,1737,0,0,1734,1739,1,301,1734,1736,0,0,1734,329,0,0,1734,336,0,0,1735,1744,1,301,1735,329,0,0,1735,336,0,0,1735,1741,0,0,1736,10,0,0,1737,10,0,0,1738,1096,0,0,1738,1750,0,0,1738,329,0,0,1739,4,0,0,1740,336,0,0,1740,1742,0,0,1740,329,0,0,1740,1746,1,301,1741,10,0,0,1742,10,0,0,1743,1753,0,0,1743,1758,1,301,1743,336,0,0,1743,329,0,0,1744,4,0,0,1745,329,0,0,1745,336,0,0,1745,1760,1,301,1745,1749,0,0,1746,4,0,0,1747,329,0,0,1747,1757,0,0,1747,536,0,0,1748,1756,0,0,1748,1762,1,301,1748,336,0,0,1748,329,0,0,1749,10,0,0,1750,1755,0,0,1750,13,0,0,1750,1752,0,0,1751,336,0,0,1751,1759,1,301,1751,329,0,0,1751,1754,0,0,1753,10,0,0,1754,10,0,0,1755,30,0,0,1756,10,0,0,1757,10,0,0,1758,4,0,0,1759,4,0,0,1760,4,0,0,1761,1766,1,301,1761,336,0,0,1761,329,0,0,1761,1763,0,0,1762,4,0,0,1763,10,0,0,1764,1769,1,301,1764,336,0,0,1764,329,0,0,1764,1767,0,0,1765,329,0,0,1765,536,0,0,1765,1770,0,0,1766,4,0,0,1767,10,0,0,1768,1096,0,0,1768,329,0,0,1768,1772,0,0,1769,4,0,0,1770,10,0,0,1771,1777,1,301,1771,336,0,0,1771,1774,0,0,1771,329,0,0,1772,1773,0,0,1772,1775,0,0,1772,13,0,0,1774,10,0,0,1775,30,0,0,1776,329,0,0,1776,1778,0,0,1776,536,0,0,1777,4,0,0,1778,10,0,0,1779,1782,0,0,1780,1783,0,0,1780,536,0,0,1780,329,0,0,1781,1785,1,301,1781,336,0,0,1781,329,0,0,1781,1784,0,0,1782,329,0,0,1782,1,0,0,1782,1786,0,0,1783,10,0,0,1784,10,0,0,1785,4,0,0,1786,1,0,0,1786,1789,0,0,1786,329,0,0,1787,1788,0,0,1787,329,0,0,1787,536,0,0,1788,10,0,0,1789,1,0,0,1789,329,0,0,1789,1792,0,0,1790,336,0,0,1790,329,0,0,1790,1791,0,0,1790,1793,1,301,1791,10,0,0,1792,1796,0,0,1792,329,0,0,1792,1,0,0,1793,4,0,0,1794,329,0,0,1794,536,0,0,1794,1795,0,0,1795,10,0,0,1796,1,0,0,1796,329,0,0,1796,1802,0,0,1797,1799,0,0,1797,1801,1,301,1797,336,0,0,1797,329,0,0,1798,1800,0,0,1798,536,0,0,1798,329,0,0,1799,10,0,0,1800,10,0,0,1801,4,0,0,1802,329,0,0,1802,1803,0,0,1802,1,0,0,1803,1,0,0,1803,329,0,0,1803,1808,0,0,1804,536,0,0,1804,1806,0,0,1804,329,0,0,1805,1807,0,0,1805,329,0,0,1805,1809,1,301,1805,336,0,0,1806,10,0,0,1807,10,0,0,1808,1,0,0,1808,329,0,0,1808,1077,0,0,1809,4,0,0,1810,1096,0,0,1810,329,0,0,1810,1813,0,0,1811,1817,1,301,1811,336,0,0,1811,329,0,0,1811,1814,0,0,1812,1,0,0,1812,329,0,0,1812,950,0,0,1812,1819,0,0,1812,1816,0,0,1813,13,0,0,1813,1818,0,0,1813,1815,0,0,1814,10,0,0,1816,35,0,0,1817,4,0,0,1818,30,0,0,1819,2,0,0,1820,1823,1,301,1820,1822,0,0,1820,329,0,0,1820,336,0,0,1821,1824,0,0,1821,1096,0,0,1821,329,0,0,1822,10,0,0,1823,4,0,0,1824,1825,0,0,1824,1826,0,0,1824,13,0,0,1826,30,0,0,1827,1828,0,0,1827,329,0,0,1827,336,0,0,1827,1829,1,301,1828,10,0,0,1829,4,0,0,1830,329,0,0,1830,1096,0,0,1830,1831,0,0,1831,13,0,0,1831,1833,0,0,1831,1835,0,0,1832,1,0,0,1832,329,0,0,1832,1834,0,0,1832,331,0,0,1834,35,0,0,1835,30,0,0,1836,1096,0,0,1836,329,0,0,1836,1837,0,0,1837,1838,0,0,1837,1839,0,0,1837,13,0,0,1839,30,0,0,1840,1096,0,0,1840,329,0,0,1840,1841,0,0,1841,13,0,0,1841,1843,0,0,1841,1842,0,0,1843,30,0,0,1844,1096,0,0,1844,329,0,0,1844,1845,0,0,1845,1846,0,0,1845,1847,0,0,1845,13,0,0,1847,30,0,0,1848,1096,0,0,1848,329,0,0,1848,1849,0,0,1849,13,0,0,1849,1850,0,0,1849,1851,0,0,1851,30,0,0,1852,1096,0,0,1852,329,0,0,1852,1853,0,0,1853,13,0,0,1853,1855,0,0,1853,1854,0,0,1855,30,0,0,1856,1096,0,0,1856,329,0,0,1856,1857,0,0,1857,2194,0,0,1857,13,0,0,1857,2195,0,0,1858,536,0,0,1858,329,0,0,1858,1859,0,0,1859,10,0,0,1860,329,0,0,1860,1096,0,0,1860,1871,0,0,1861,1096,0,0,1861,329,0,0,1861,1867,0,0,1862,329,0,0,1862,536,0,0,1862,1863,0,0,1863,10,0,0,1864,1096,0,0,1864,1875,0,0,1864,329,0,0,1865,329,0,0,1865,1877,0,0,1865,1096,0,0,1866,1885,0,0,1866,329,0,0,1866,1096,0,0,1867,1872,0,0,1867,1868,0,0,1867,13,0,0,1869,1870,0,0,1869,329,0,0,1869,536,0,0,1870,10,0,0,1871,1879,0,0,1871,13,0,0,1871,1873,0,0,1872,30,0,0,1874,1883,0,0,1874,329,0,0,1874,1096,0,0,1875,1878,0,0,1875,1889,0,0,1875,13,0,0,1876,1886,0,0,1876,329,0,0,1876,1096,0,0,1877,13,0,0,1877,1894,0,0,1877,1881,0,0,1879,30,0,0,1880,536,0,0,1880,329,0,0,1880,1882,0,0,1882,10,0,0,1883,13,0,0,1883,1890,0,0,1883,1884,0,0,1885,13,0,0,1885,1891,0,0,1885,1887,0,0,1886,1892,0,0,1886,13,0,0,1886,1888,0,0,1889,30,0,0,1890,30,0,0,1891,30,0,0,1892,30,0,0,1893,1906,0,0,1893,329,0,0,1893,1096,0,0,1894,30,0,0,1895,1901,0,0,1895,329,0,0,1895,536,0,0,1896,329,0,0,1896,1902,0,0,1896,1089,0,0,1897,329,0,0,1897,1905,0,0,1897,1096,0,0,1898,1096,0,0,1898,329,0,0,1898,1907,0,0,1899,1915,0,0,1899,1096,0,0,1899,329,0,0,1900,1096,0,0,1900,329,0,0,1900,1904,0,0,1901,10,0,0,1902,13,0,0,1902,1911,0,0,1902,1903,0,0,1904,1912,0,0,1904,13,0,0,1904,1919,0,0,1905,1908,0,0,1905,13,0,0,1905,1920,0,0,1906,13,0,0,1906,1918,0,0,1906,1913,0,0,1907,13,0,0,1907,1910,0,0,1907,1914,0,0,1909,1942,0,0,1909,1917,0,0,1911,30,0,0,1914,30,0,0,1915,13,0,0,1915,1922,0,0,1915,1921,0,0,1916,329,0,0,1916,1935,0,0,1916,1096,0,0,1917,1096,0,0,1917,329,0,0,1917,1928,0,0,1918,30,0,0,1919,30,0,0,1920,30,0,0,1922,30,0,0,1923,1096,0,0,1923,329,0,0,1923,1926,0,0,1924,1096,0,0,1924,329,0,0,1924,1936,0,0,1925,1096,0,0,1925,1929,0,0,1925,329,0,0,1926,1927,0,0,1926,1932,0,0,1926,13,0,0,1928,1931,0,0,1928,13,0,0,1928,1934,0,0,1929,1933,0,0,1929,1939,0,0,1929,13,0,0,1930,1941,0,0,1930,329,0,0,1930,1096,0,0,1932,30,0,0,1934,30,0,0,1935,1937,0,0,1935,13,0,0,1935,1956,0,0,1936,1938,0,0,1936,1945,0,0,1936,13,0,0,1939,30,0,0,1940,329,0,0,1940,1947,0,0,1940,1096,0,0,1941,1943,0,0,1941,1946,0,0,1941,13,0,0,1942,1,0,0,1942,950,0,0,1942,329,0,0,1944,1096,0,0,1944,1953,0,0,1944,329,0,0,1945,30,0,0,1946,30,0,0,1947,1949,0,0,1947,1950,0,0,1947,13,0,0,1948,1982,0,0,1948,1952,0,0,1950,30,0,0,1951,1096,0,0,1951,329,0,0,1951,1960,0,0,1952,1096,0,0,1952,329,0,0,1952,1963,0,0,1953,1954,0,0,1953,13,0,0,1953,1957,0,0,1955,1962,0,0,1955,329,0,0,1955,1096,0,0,1956,30,0,0,1957,30,0,0,1958,1970,0,0,1958,1096,0,0,1958,329,0,0,1959,329,0,0,1959,1096,0,0,1959,1974,0,0,1960,13,0,0,1960,1961,0,0,1960,1967,0,0,1962,13,0,0,1962,1968,0,0,1962,1964,0,0,1963,13,0,0,1963,1855,0,0,1963,1965,0,0,1966,329,0,0,1966,1972,0,0,1966,1096,0,0,1967,30,0,0,1968,30,0,0,1969,1096,0,0,1969,329,0,0,1969,1978,0,0,1970,1971,0,0,1970,1975,0,0,1970,13,0,0,1972,13,0,0,1972,1981,0,0,1972,1973,0,0,1974,1987,0,0,1974,13,0,0,1974,1976,0,0,1975,30,0,0,1977,1096,0,0,1977,329,0,0,1977,1985,0,0,1978,13,0,0,1978,1983,0,0,1978,1980,0,0,1979,1096,0,0,1979,329,0,0,1979,1988,0,0,1981,30,0,0,1982,1,0,0,1982,329,0,0,1982,950,0,0,1983,30,0,0,1984,1096,0,0,1984,1992,0,0,1984,329,0,0,1985,1990,0,0,1985,13,0,0,1985,1986,0,0,1987,30,0,0,1988,13,0,0,1988,1996,0,0,1988,1989,0,0,1990,30,0,0,1991,1096,0,0,1991,329,0,0,1991,1998,0,0,1992,13,0,0,1992,1993,0,0,1992,1999,0,0,1994,2042,0,0,1994,2008,0,0,1995,1096,0,0,1995,329,0,0,1995,2004,0,0,1996,30,0,0,1997,1096,0,0,1997,329,0,0,1997,2014,0,0,1998,13,0,0,1998,2003,0,0,1998,2000,0,0,1999,30,0,0,2001,2011,0,0,2001,329,0,0,2001,1096,0,0,2002,2007,0,0,2002,329,0,0,2002,1096,0,0,2003,30,0,0,2004,2010,0,0,2004,13,0,0,2004,2005,0,0,2006,1096,0,0,2006,329,0,0,2006,2015,0,0,2007,13,0,0,2007,2020,0,0,2007,2009,0,0,2008,329,0,0,2008,2021,0,0,2008,1096,0,0,2010,30,0,0,2011,13,0,0,2011,2023,0,0,2011,2013,0,0,2012,1096,0,0,2012,2025,0,0,2012,329,0,0,2014,13,0,0,2014,2016,0,0,2014,2019,0,0,2015,13,0,0,2015,2022,0,0,2015,2018,0,0,2017,1096,0,0,2017,329,0,0,2017,2026,0,0,2019,30,0,0,2020,30,0,0,2021,2024,0,0,2021,2027,0,0,2021,13,0,0,2022,30,0,0,2023,30,0,0,2025,13,0,0,2025,2036,0,0,2025,2030,0,0,2026,13,0,0,2026,2032,0,0,2026,2028,0,0,2027,30,0,0,2029,2034,0,0,2029,329,0,0,2029,1096,0,0,2031,1096,0,0,2031,329,0,0,2031,2039,0,0,2032,30,0,0,2033,1096,0,0,2033,329,0,0,2033,2044,0,0,2034,13,0,0,2034,2040,0,0,2034,2035,0,0,2036,30,0,0,2037,1096,0,0,2037,329,0,0,2037,2049,0,0,2038,2066,0,0,2038,329,0,0,2038,1096,0,0,2039,2047,0,0,2039,13,0,0,2039,2041,0,0,2040,30,0,0,2042,950,0,0,2042,1,0,0,2042,329,0,0,2043,329,0,0,2043,1096,0,0,2043,2056,0,0,2044,1934,0,0,2044,13,0,0,2044,2046,0,0,2045,329,0,0,2045,1096,0,0,2045,2057,0,0,2047,30,0,0,2048,1096,0,0,2048,329,0,0,2048,2052,0,0,2049,2051,0,0,2049,2050,0,0,2049,13,0,0,2051,30,0,0,2052,13,0,0,2052,2060,0,0,2052,2053,0,0,2054,1096,0,0,2054,329,0,0,2054,2064,0,0,2055,2093,0,0,2055,329,0,0,2055,1096,0,0,2056,2063,0,0,2056,2058,0,0,2056,13,0,0,2057,2062,0,0,2057,13,0,0,2057,2061,0,0,2059,2099,0,0,2059,2071,0,0,2060,30,0,0,2062,30,0,0,2063,30,0,0,2064,2068,0,0,2064,13,0,0,2064,2065,0,0,2066,2069,0,0,2066,13,0,0,2066,2067,0,0,2068,30,0,0,2069,30,0,0,2070,1096,0,0,2070,329,0,0,2070,2080,0,0,2071,1096,0,0,2071,2086,0,0,2071,329,0,0,2072,2075,0,0,2072,329,0,0,2072,1096,0,0,2073,2078,0,0,2073,1096,0,0,2073,329,0,0,2074,1096,0,0,2074,329,0,0,2074,2084,0,0,2075,13,0,0,2075,2083,0,0,2075,2076,0,0,2077,1096,0,0,2077,329,0,0,2077,2085,0,0,2078,13,0,0,2078,2079,0,0,2078,2082,0,0,2080,13,0,0,2080,2090,0,0,2080,2081,0,0,2082,30,0,0,2083,30,0,0,2084,2088,0,0,2084,2092,0,0,2084,13,0,0,2085,2094,0,0,2085,2087,0,0,2085,13,0,0,2086,2047,0,0,2086,2089,0,0,2086,13,0,0,2090,30,0,0,2091,2107,0,0,2091,1096,0,0,2091,329,0,0,2092,30,0,0,2093,2095,0,0,2093,13,0,0,2093,2097,0,0,2094,30,0,0,2096,2101,0,0,2096,1096,0,0,2096,329,0,0,2097,30,0,0,2098,1096,0,0,2098,329,0,0,2098,2104,0,0,2099,1,0,0,2099,329,0,0,2099,950,0,0,2100,329,0,0,2100,1096,0,0,2100,2113,0,0,2101,13,0,0,2101,2111,0,0,2101,2102,0,0,2103,2115,0,0,2103,329,0,0,2103,1096,0,0,2104,13,0,0,2104,2114,0,0,2104,2105,0,0,2106,2140,0,0,2106,2118,0,0,2107,2112,0,0,2107,13,0,0,2107,2108,0,0,2109,1096,0,0,2109,329,0,0,2109,2120,0,0,2110,2119,0,0,2110,1096,0,0,2110,329,0,0,2111,30,0,0,2112,30,0,0,2113,13,0,0,2113,2116,0,0,2113,2125,0,0,2114,30,0,0,2115,2117,0,0,2115,2121,0,0,2115,13,0,0,2118,1096,0,0,2118,329,0,0,2118,2126,0,0,2119,13,0,0,2119,2127,0,0,2119,2124,0,0,2120,13,0,0,2120,2131,0,0,2120,2122,0,0,2121,30,0,0,2123,1096,0,0,2123,329,0,0,2123,2137,0,0,2125,30,0,0,2126,2129,0,0,2126,2195,0,0,2126,13,0,0,2127,30,0,0,2128,329,0,0,2128,2142,0,0,2128,1096,0,0,2130,1096,0,0,2130,329,0,0,2130,2132,0,0,2131,30,0,0,2132,13,0,0,2132,2138,0,0,2132,2134,0,0,2133,1096,0,0,2133,2145,0,0,2133,329,0,0,2135,2156,0,0,2135,329,0,0,2135,1096,0,0,2136,329,0,0,2136,1096,0,0,2136,2147,0,0,2137,13,0,0,2137,2143,0,0,2137,2139,0,0,2138,30,0,0,2140,329,0,0,2140,1,0,0,2140,950,0,0,2141,1096,0,0,2141,329,0,0,2141,2152,0,0,2142,13,0,0,2142,2148,0,0,2142,2144,0,0,2143,30,0,0,2145,2149,0,0,2145,2146,0,0,2145,13,0,0,2147,2160,0,0,2147,13,0,0,2147,2150,0,0,2148,30,0,0,2149,30,0,0,2151,536,0,0,2151,329,0,0,2151,2153,0,0,2152,13,0,0,2152,2157,0,0,2152,2154,0,0,2153,10,0,0,2155,1096,0,0,2155,329,0,0,2155,2176,0,0,2156,13,0,0,2156,2163,0,0,2156,2158,0,0,2157,30,0,0,2159,536,0,0,2159,2162,0,0,2159,329,0,0,2160,30,0,0,2161,2169,0,0,2161,329,0,0,2161,1096,0,0,2162,10,0,0,2163,30,0,0,2164,329,0,0,2164,2167,0,0,2164,1096,0,0,2165,329,0,0,2165,2170,0,0,2165,1096,0,0,2166,1096,0,0,2166,2172,0,0,2166,329,0,0,2167,2168,0,0,2167,2173,0,0,2167,13,0,0,2169,2180,0,0,2169,2171,0,0,2169,13,0,0,2170,2183,0,0,2170,2177,0,0,2170,13,0,0,2172,13,0,0,2172,2185,0,0,2172,2182,0,0,2173,30,0,0,2174,1490,0,0,2175,1096,0,0,2175,2184,0,0,2175,329,0,0,2176,2193,0,0,2176,2178,0,0,2176,13,0,0,2179,2189,0,0,2179,329,0,0,2179,1096,0,0,2180,30,0,0,2181,2186,0,0,2183,30,0,0,2184,2190,0,0,2184,13,0,0,2184,2187,0,0,2185,30,0,0,2188,329,0,0,2188,1096,0,0,2188,2198,0,0,2189,13,0,0,2189,2196,0,0,2189,2191,0,0,2190,30,0,0,2192,1096,0,0,2192,329,0,0,2192,2201,0,0,2193,30,0,0,2195,30,0,0,2196,30,0,0,2197,2202,0,0,2197,2205,1,301,2197,329,0,0,2197,336,0,0,2198,2200,0,0,2198,2203,0,0,2198,13,0,0,2199,2206,0,0,2199,329,0,0,2199,1096,0,0,2201,2204,0,0,2201,2208,0,0,2201,13,0,0,2202,10,0,0,2203,30,0,0,2205,4,0,0,2206,13,0,0,2206,2207,0,0,2206,2027,0,0,2208,30,0,0,2209,2210,0,0,2209,329,0,0,2209,336,0,0,2209,2211,1,301,2210,10,0,0,2211,4,0,0,2212,2213,0,0,2212,946,1,499,2212,2213,1,301,2212,2214,0,0,2213,4,0,0,2214,2215,0,0,2214,946,0,0,2214,329,0,0,2214,1,0,0,2215,35,0,0,2216,1131,1,499,2216,1511,1,500,2216,328,0,0,2216,1132,0,0,2216,2217,1,301,2216,2217,0,0,2216,2218,0,0,2217,4,0,0,2218,1,0,0,2218,329,0,0,2218,946,0,0,2218,2219,0,0,2219,329,0,0,2219,2220,0,0,2219,946,0,0,2219,1,0,0,2220,35,0,0,2221,2224,1,499,2221,2222,0,0,2221,2223,0,0,2221,2229,0,0,2221,2223,1,301,2222,329,0,0,2222,1,0,0,2222,2224,0,0,2223,4,0,0,2224,328,1,523,2224,2226,0,0,2224,2225,1,301,2224,2221,1,300,2225,4,0,0,2226,2227,0,0,2226,952,0,0,2226,329,0,0,2226,1,0,0,2227,2228,0,0,2227,952,0,0,2227,329,0,0,2227,1,0,0,2228,1,0,0,2228,329,0,0,2228,952,0,0,2228,874,0,0,2229,1,0,0,2229,329,0,0,2229,2315,0,0,2229,2230,0,0,2230,2231,0,0,2230,1,0,0,2230,2315,0,0,2230,329,0,0,2231,880,0,0,2231,2315,0,0,2231,329,0,0,2231,1,0,0,2232,2233,0,0,2232,2235,1,499,2232,2229,0,0,2232,2234,0,0,2232,2234,1,301,2233,1,0,0,2233,329,0,0,2233,2235,0,0,2234,4,0,0,2235,2236,1,301,2235,328,1,523,2235,2232,1,300,2235,2226,0,0,2236,4,0,0,2237,2248,1,208,2237,2245,1,639,2237,2242,1,640,2237,2239,1,641,2237,950,1,499,2237,2251,0,0,2237,2238,0,0,2237,2238,1,301,2238,4,0,0,2239,2240,0,0,2239,329,0,0,2239,336,0,0,2239,2241,1,301,2240,10,0,0,2241,4,0,0,2242,2243,0,0,2242,329,0,0,2242,336,0,0,2242,2244,1,301,2243,10,0,0,2244,4,0,0,2245,329,0,0,2245,2246,0,0,2245,2247,1,301,2245,336,0,0,2246,10,0,0,2247,4,0,0,2248,2250,1,301,2248,2249,0,0,2248,329,0,0,2248,336,0,0,2249,10,0,0,2250,4,0,0,2251,2252,0,0,2251,946,0,0,2251,329,0,0,2251,1,0,0,2252,35,0,0,2253,2254,0,0,2253,768,1,642,2253,1511,1,500,2253,977,1,499,2253,2254,1,301,2253,2255,0,0,2254,4,0,0,2255,1,0,0,2255,329,0,0,2255,946,0,0,2255,2256,0,0,2256,35,0,0,2257,2258,1,301,2257,2355,0,0,2257,2258,0,0,2257,1128,1,499,2257,1511,1,500,2257,2259,1,643,2257,2356,1,644,2258,4,0,0,2259,2261,1,301,2259,2260,0,0,2259,329,0,0,2259,336,0,0,2260,10,0,0,2261,4,0,0,2262,6,0,0,2263,6,0,0,2264,6,0,0,2265,6,0,0,2266,6,0,0,2267,6,0,0,2268,6,0,0,2269,6,0,0,2270,6,0,0,2271,6,0,0,2272,6,0,0,2273,6,0,0,2274,6,0,0,2275,6,0,0,2276,6,0,0,2277,6,0,0,2278,6,0,0,2279,6,0,0,2280,6,0,0,2281,6,0,0,2282,6,0,0,2283,6,0,0,2284,6,0,0,2285,6,0,0,2286,6,0,0,2287,6,0,0,2288,6,0,0,2289,6,0,0,2290,6,0,0,2291,6,0,0,2292,6,0,0,2293,6,0,0,2294,1268,0,0,2294,1378,1,645,2294,1391,1,646,2294,1403,1,647,2294,1442,1,648,2294,1462,1,649,2294,1470,1,650,2294,1481,1,651,2295,2341,0,0,2295,2302,1,652,2295,2321,1,653,2296,6,0,0,2297,2326,0,0,2297,924,1,654,2297,1108,1,655,2297,1021,1,656,2297,1185,1,657,2297,2310,1,658,2298,6,0,0,2299,336,0,0,2299,329,0,0,2299,2303,0,0,2299,2307,1,301,2300,6,0,0,2301,6,0,0,2302,336,0,0,2302,329,0,0,2302,2305,0,0,2302,2313,1,301,2303,10,0,0,2304,2322,0,0,2304,1511,1,500,2304,1205,1,499,2304,2308,1,301,2304,2308,0,0,2305,10,0,0,2306,2311,0,0,2306,2311,1,301,2306,1511,1,500,2306,2329,0,0,2306,1200,1,499,2307,4,0,0,2308,4,0,0,2309,6,0,0,2310,2312,0,0,2310,329,0,0,2310,2319,1,301,2310,336,0,0,2311,4,0,0,2312,10,0,0,2313,4,0,0,2314,1210,1,499,2314,1511,1,500,2314,2316,0,0,2314,2328,1,659,2314,2353,1,660,2314,2378,0,0,2314,2316,1,301,2315,952,1,499,2315,2317,0,0,2315,2325,0,0,2315,2317,1,301,2316,4,0,0,2317,4,0,0,2318,2320,0,0,2318,2320,1,301,2318,2334,0,0,2318,1184,1,499,2319,4,0,0,2320,4,0,0,2321,2323,0,0,2321,329,0,0,2321,336,0,0,2321,2324,1,301,2322,2331,0,0,2322,946,0,0,2322,329,0,0,2322,1,0,0,2323,10,0,0,2324,4,0,0,2325,946,0,0,2325,2327,0,0,2325,329,0,0,2325,1,0,0,2326,329,0,0,2326,1,0,0,2326,950,0,0,2326,2338,0,0,2327,35,0,0,2328,329,0,0,2328,1096,0,0,2328,2339,0,0,2329,946,0,0,2329,2340,0,0,2329,329,0,0,2329,1,0,0,2330,329,0,0,2330,2332,0,0,2330,336,0,0,2330,2335,1,301,2331,329,0,0,2331,1,0,0,2331,946,0,0,2331,2333,0,0,2332,10,0,0,2333,35,0,0,2334,1,0,0,2334,329,0,0,2334,946,0,0,2334,2337,0,0,2335,4,0,0,2336,2347,0,0,2336,2379,0,0,2336,2347,1,301,2336,1136,1,499,2336,2197,1,295,2336,2209,1,294,2336,2363,1,661,2337,35,0,0,2338,2343,0,0,2338,950,0,0,2338,1,0,0,2338,329,0,0,2339,2346,0,0,2339,2342,0,0,2339,13,0,0,2340,946,0,0,2340,2344,0,0,2340,329,0,0,2340,1,0,0,2341,329,0,0,2341,950,0,0,2341,1,0,0,2341,2345,0,0,2343,35,0,0,2344,35,0,0,2345,35,0,0,2346,30,0,0,2347,4,0,0,2348,2350,0,0,2348,329,0,0,2348,2351,1,301,2348,336,0,0,2349,2352,0,0,2349,1151,1,499,2349,2365,0,0,2349,2352,1,301,2350,10,0,0,2351,4,0,0,2352,4,0,0,2353,2361,0,0,2353,329,0,0,2353,1096,0,0,2354,2374,1,662,2354,2373,1,663,2354,2369,1,664,2354,1135,1,499,2354,2359,1,301,2354,2375,1,665,2354,2376,1,666,2354,2377,1,667,2354,2381,1,668,2354,2384,1,669,2354,2386,1,670,2354,2389,1,671,2354,2390,1,672,2354,2359,0,0,2354,2392,0,0,2354,2388,1,673,2355,1,0,0,2355,2357,0,0,2355,946,0,0,2355,329,0,0,2356,2360,1,301,2356,2358,0,0,2356,329,0,0,2356,336,0,0,2357,35,0,0,2358,10,0,0,2359,4,0,0,2360,4,0,0,2361,2364,0,0,2361,2368,0,0,2361,13,0,0,2362,1,0,0,2362,329,0,0,2362,2372,0,0,2362,2366,0,0,2363,336,0,0,2363,329,0,0,2363,2367,0,0,2363,2371,1,301,2365,1,0,0,2365,329,0,0,2365,946,0,0,2365,2370,0,0,2366,35,0,0,2367,10,0,0,2368,30,0,0,2369,17,0,0,2370,35,0,0,2371,4,0,0,2372,2382,0,0,2373,17,0,0,2374,17,0,0,2375,17,0,0,2376,17,0,0,2377,17,0,0,2378,1,0,0,2378,329,0,0,2378,946,0,0,2378,2380,0,0,2379,946,0,0,2379,2383,0,0,2379,329,0,0,2379,1,0,0,2380,35,0,0,2381,17,0,0,2382,2385,0,0,2382,2387,0,0,2382,329,0,0,2382,1,0,0,2383,35,0,0,2384,17,0,0,2385,35,0,0,2386,17,0,0,2387,2391,0,0,2388,17,0,0,2389,17,0,0,2390,17,0,0,2391,329,0,0,2391,1,0,0,2391,331,0,0,2392,2394,0,0,2392,946,0,0,2392,329,0,0,2392,1,0,0,2393,2395,0,0,2393,2372,0,0,2393,329,0,0,2393,1,0,0,2394,35,0,0,2395,35,0,0,2396,4,0,0,2397,5,0,0],"edgeTypes":["Internal","Property","Index","Variable"],"edgeNames":["PrivateSymbol.readableStreamDefaultControllerCanCloseOrEnqueue","RTCRtpReceiver","PrivateSymbol.isReadableStreamDisturbed","PrivateSymbol.asyncGeneratorResolve","PrivateSymbol.regExpMatchFast","PrivateSymbol.regExpSplitFast","PrivateSymbol.readableStreamAddReadRequest","PrivateSymbol.privateInitializeReadableStreamDefaultController","PrivateSymbol.hasOwnLengthProperty","PrivateSymbol.createArrayIterator","PrivateSymbol.Set","PrivateSymbol.closeWritableStream","PrivateSymbol.readableStreamClose","PrivateSymbol.hostPromiseRejectionTracker","PrivateSymbol.assert","PrivateSymbol.InternalPromise","PrivateSymbol.mapIteratorNext","PrivateSymbol.thisTimeValue","PrivateSymbol.isArray","PrivateSymbol.getDefaultCollator","PrivateSymbol.privateInitializeReadableStreamBYOBRequest","PrivateSymbol.isArraySlow","PrivateSymbol.importModule","PrivateSymbol.concatSlowPath","PrivateSymbol.enqueueJob","PrivateSymbol.regExpProtoSourceGetter","PrivateSymbol.readableStreamDefaultControllerClose","PrivateSymbol.asyncGeneratorQueueIsEmpty","PrivateSymbol.isConstructor","PrivateSymbol.newPromiseReaction","PrivateSymbol.readableStreamError","PrivateSymbol.createSetIterator","PrivateSymbol.ReadableStreamDefaultReader","PrivateSymbol.getCatchFinally","PrivateSymbol.stringSplitFast","PrivateSymbol.readableStreamPipeTo","PrivateSymbol.arrayIteratorKeyValueNext","PrivateSymbol.copyDataProperties","PrivateSymbol.structuredCloneArrayBuffer","PrivateSymbol.readableStreamReaderGenericInitialize","PrivateSymbol.speciesConstructor","PrivateSymbol.readableByteStreamControllerShouldCallPull","PrivateSymbol.objectAndCallbacksOverload","PrivateSymbol.asyncGeneratorQueueDequeue","PrivateSymbol.mapBucketHead","PrivateSymbol.mapBucketNext","PrivateSymbol.readableStreamTeeBranch2CancelFunction","PrivateSymbol.regExpBuiltinExec","PrivateSymbol.matchSlow","PrivateSymbol.isNaN","PrivateSymbol.readableStreamTee","PrivateSymbol.readableByteStreamControllerCommitDescriptor","PrivateSymbol.NumberFormat","PrivateSymbol.repeatCharactersSlowPath","PrivateSymbol.readableByteStreamControllerCallPullIfNeeded","PrivateSymbol.errorWritableStream","PrivateSymbol.isExecutionState","PrivateSymbol.validateAndNormalizeQueuingStrategy","PrivateSymbol.isReadableStreamBYOBReader","PrivateSymbol.newRegistryEntry","PrivateSymbol.isReadableStreamBYOBRequest","PrivateSymbol.promiseInvokeOrNoopNoCatch","PrivateSymbol.AsyncFromSyncIteratorConstructor","PrivateSymbol.newPromiseCapability","PrivateSymbol.regExpProtoIgnoreCaseGetter","PrivateSymbol.readableStreamFulfillReadIntoRequest","PrivateSymbol.typedArrayGetOriginalConstructor","PrivateSymbol.readableByteStreamControllerShiftPendingDescriptor","PrivateSymbol.readableByteStreamControllerPull","PrivateSymbol.BuiltinLog","PrivateSymbol.createAsyncFromSyncIterator","window","PrivateSymbol.typedArraySubarrayCreate","PrivateSymbol.readableByteStreamControllerRespondWithNewView","PrivateSymbol.RangeError","PrivateSymbol.promiseReactionJob","PrivateSymbol.hasObservableSideEffectsForRegExpSplit","PrivateSymbol.readableByteStreamControllerProcessPullDescriptors","PrivateSymbol.readableStreamDefaultControllerError","PrivateSymbol.asyncGeneratorEnqueue","PrivateSymbol.readableByteStreamControllerEnqueue","PrivateSymbol.stringSubstrInternal","PrivateSymbol.readableByteStreamControllerError","PrivateSymbol.ReadableByteStreamController","PrivateSymbol.regExpProtoUnicodeGetter","PrivateSymbol.readableByteStreamControllerConvertDescriptor","PrivateSymbol.readableByteStreamControllerFillDescriptorFromQueue","PrivateSymbol.setBucketNext","PrivateSymbol.regExpTestFast","PrivateSymbol.ArrayBuffer","PrivateSymbol.readableByteStreamControllerInvalidateBYOBRequest","PrivateSymbol.newHandledRejectedPromise","PrivateSymbol.abs","PrivateSymbol.Promise","PrivateSymbol.readableStreamReaderGenericCancel","PrivateSymbol.regExpProtoFlagsGetter","PrivateSymbol.readableStreamDefaultReaderRead","PrivateSymbol.readableStreamReaderGenericRelease","PrivateSymbol.callbacksAndDictionaryOverload","PrivateSymbol.doStructuredClone","PrivateSymbol.asyncFunctionResume","PrivateSymbol.readableStreamCancel","PrivateSymbol.flatIntoArray","PrivateSymbol.trunc","PrivateSymbol.privateInitializeReadableByteStreamController","PrivateSymbol.setBucketHead","PrivateSymbol.readableByteStreamControllerCancel","PrivateSymbol.concatMemcpy","PrivateSymbol.asyncGeneratorDequeue","PrivateSymbol.promiseInvokeOrFallbackOrNoop","PrivateSymbol.stringConcatSlowPath","PrivateSymbol.createResolvingFunctions","PrivateSymbol.isDictionary","PrivateSymbol.copyDataPropertiesNoExclusions","PrivateSymbol.getThenFinally","PrivateSymbol.webRTCLegacyAPIEnabled","PrivateSymbol.readableByteStreamAPIEnabled","PrivateSymbol.isSuspendYieldState","PrivateSymbol.shieldingPromiseResolve","PrivateSymbol.generatorResume","PrivateSymbol.isReadableStreamDefaultReader","PrivateSymbol.isReadableStreamLocked","PrivateSymbol.Map","PrivateSymbol.typedArraySort","PrivateSymbol.isReadableStreamDefaultController","PrivateSymbol.privateInitializeReadableStreamDefaultReader","PrivateSymbol.isReadableStream","PrivateSymbol.readableStreamDefaultControllerEnqueue","PrivateSymbol.structuredCloneArrayBufferView","PrivateSymbol.readableStreamDefaultControllerGetDesiredSize","PrivateSymbol.isTypedArrayView","PrivateSymbol.fulfillPromise","PrivateSymbol.readableByteStreamControllerRespond","PrivateSymbol.newQueue","PrivateSymbol.propertyIsEnumerable","PrivateSymbol.readableStreamTeeBranch1CancelFunction","PrivateSymbol.readableStreamBYOBReaderRead","PrivateSymbol.flatIntoArrayWithCallback","PrivateSymbol.makeGetterTypeError","PrivateSymbol.triggerPromiseReactions","PrivateSymbol.isRTCPeerConnection","PrivateSymbol.regExpProtoGlobalGetter","PrivateSymbol.repeatCharacter","PrivateSymbol.toInteger","PrivateSymbol.regExpCreate","PrivateSymbol.isArrayConstructor","PrivateSymbol.hasObservableSideEffectsForRegExpMatch","PrivateSymbol.ReadableStreamBYOBReader","PrivateSymbol.initializePromise","PrivateSymbol.isBoundFunction","PrivateSymbol.callOrScheduleWritableStreamAdvanceQueue","PrivateSymbol.readableStreamFulfillReadRequest","PrivateSymbol.stringIncludesInternal","PrivateSymbol.arrayIteratorKeyNext","PrivateSymbol.readableByteStreamControllerRespondInClosedState","PrivateSymbol.typedArrayLength","PrivateSymbol.setIteratorNext","PrivateSymbol.hasObservableSideEffectsForStringReplace","PrivateSymbol.setStateToMax","PrivateSymbol.dequeueValue","PrivateSymbol.regExpProtoMultilineGetter","PrivateSymbol.setBucketKey","PrivateSymbol.thisNumberValue","PrivateSymbol.readableByteStreamControllerClearPendingPullIntos","PrivateSymbol.cloneArrayBuffer","PrivateSymbol.makeThisTypeError","PrivateSymbol.privateInitializeReadableStreamBYOBReader","PrivateSymbol.ReadableStreamBYOBRequest","PrivateSymbol.awaitValue","PrivateSymbol.BuiltinDescribe","PrivateSymbol.arrayIteratorValueNext","PrivateSymbol.readableStreamDefaultControllerCallPullIfNeeded","PrivateSymbol.TypeError","PrivateSymbol.isReadableByteStreamController","PrivateSymbol.readableStreamTeePullFunction","PrivateSymbol.Collator","PrivateSymbol.InspectorInstrumentation","PrivateSymbol.readableStreamHasBYOBReader","PrivateSymbol.readableStreamHasDefaultReader","PrivateSymbol.Number","PrivateSymbol.PluralRules","PrivateSymbol.typedArraySpeciesConstructor","PrivateSymbol.readableStreamAddReadIntoRequest","PrivateSymbol.readableStreamDefaultControllerPull","PrivateSymbol.promiseResolveThenableJob","PrivateSymbol.appendMemcpy","PrivateSymbol.repeatSlowPath","PrivateSymbol.toLength","PrivateSymbol.rejectPromise","PrivateSymbol.hasInstanceBoundFunction","PrivateSymbol.writableStreamAdvanceQueue","PrivateSymbol.Reflect","PrivateSymbol.typedArrayClampArgumentToStartOrEnd","PrivateSymbol.readableByteStreamControllerRespondInReadableState","PrivateSymbol.isPromise","PrivateSymbol.promiseInvokeOrNoop","document","PrivateSymbol.ReadableStreamDefaultController","PrivateSymbol.readableByteStreamControllerPullInto","PrivateSymbol.readableByteStreamControllerEnqueueChunk","PrivateSymbol.readableByteStreamControllerGetDesiredSize","PrivateSymbol.doAsyncGeneratorBodyCall","PrivateSymbol.createMapIterator","PrivateSymbol.asyncGeneratorResumeNext","PrivateSymbol.regExpPrototypeSymbolReplace","PrivateSymbol.syncWritableStreamStateWithQueue","PrivateSymbol.readableByteStreamControllerHandleQueueDrain","PrivateSymbol.RegExp","PrivateSymbol.getOwnPropertyNames","PrivateSymbol.readableByteStreamControllerRespondInternal","PrivateSymbol.transferBufferToCurrentRealm","PrivateSymbol.floor","PrivateSymbol.asyncGeneratorYield","PrivateSymbol.Error","PrivateSymbol.mapLikeForEach","PrivateSymbol.regExpProtoStickyGetter","PrivateSymbol.createHTML","PrivateSymbol.regExpSearchFast","PrivateSymbol.regExpExec","PrivateSymbol.isFinite","PrivateSymbol.enqueueOperation","PrivateSymbol.readableByteStreamControllerClose","PrivateSymbol.DateTimeFormat","PrivateSymbol.advanceStringIndex","PrivateSymbol.asyncGeneratorReject","PrivateSymbol.instanceOf","PrivateSymbol.enqueueValueWithSize","PrivateSymbol.makeBoundFunction","PrivateSymbol.peekQueueValue","PrivateSymbol.isWritableStream","PrivateSymbol.readableStreamDefaultControllerCancel","PrivateSymbol.asyncGeneratorQueueEnqueue","PrivateSymbol.mapBucketKey","PrivateSymbol.mapBucketValue","PrivateSymbol.String","createImageBitmap","fetch","PrivateSymbol.ReadableStream","PrivateSymbol.RTCSessionDescription","PrivateSymbol.RTCIceCandidate","PrivateSymbol.MediaStreamTrack","PrivateSymbol.MediaStream","OffscreenCanvasRenderingContext2D","ImageBitmapRenderingContext","WebKitMediaKeyError","OffscreenCanvas","ImageBitmap","HTMLSlotElement","StaticRange","ShadowRoot","InputEvent","DataTransferItemList","DataTransferItem","CustomElementRegistry","RTCTrackEvent","RTCStatsReport","RTCSessionDescription","RTCRtpTransceiver","RTCRtpSender","RTCPeerConnection","RTCIceTransport","RTCIceCandidate","RTCDataChannelEvent","RTCDataChannel","MediaSource","Response","Request","Headers","WebKitMediaKeys","WebKitMediaKeySession","WebKitMediaKeyNeededEvent","WebKitMediaKeyMessageEvent","customElements","WebAssembly","Reflect","Intl","eval","Promise","Set","Map","Error","Boolean","Number","Symbol","String","ArrayBuffer","PrivateSymbol.Array","PrivateSymbol.Object","TypeError","RangeError","RegExp","Array","Function","Object","parseFloat","parseInt","PrivateSymbol.arraySpeciesCreate","dispatchEvent","removeEventListener","addEventListener","constructor","name","onloadedmetadata","onloadeddata","onload","onkeyup","onkeypress","onkeydown","oninvalid","oninput","onfocus","onerror","onended","onemptied","ondurationchange","ondrop","ondragstart","ondragover","ondragleave","ondragenter","ondragend","ondrag","ondblclick","oncuechange","oncontextmenu","onclick","onchange","oncanplaythrough","oncanplay","onblur","onabort","pointerLockElement","activeElement","onbeforepaste","onbeforeinput","onbeforecut","onbeforecopy","onpaste","oncut","oncopy","all","applets","anchors","bgColor","alinkColor","vlinkColor","linkColor","fgColor","onselectionchange","onselectstart","xmlStandalone","xmlVersion","xmlEncoding","onvisibilitychange","visibilityState","hidden","fonts","onpointerlockerror","onpointerlockchange","onwebkitfullscreenerror","onwebkitfullscreenchange","webkitCurrentFullScreenElement","webkitFullScreenKeyboardInputAllowed","webkitIsFullScreen","webkitFullscreenElement","webkitFullscreenEnabled","scrollingElement","styleSheets","onreadystatechange","designMode","defaultView","currentScript","scripts","forms","links","plugins","embeds","images","head","body","dir","title","readyState","lastModified","cookie","referrer","domain","documentElement","doctype","contentType","inputEncoding","charset","characterSet","compatMode","origin","documentURI","URL","implementation","onloadstart","onmousedown","onmouseenter","onwebkitmouseforceup","firstElementChild","lastElementChild","childElementCount","onwebkitmouseforcewillbegin","onwebkitmouseforcedown","onwebkitmouseforcechanged","Symbol.unscopables","querySelectorAll","querySelector","append","prepend","getElementById","elementsFromPoint","elementFromPoint","releaseEvents","captureEvents","clear","requestStorageAccess","hasStorageAccess","getCSSCanvasContext","caretRangeFromPoint","children","getOverrideStyle","exitPointerLock","webkitCancelFullScreen","webkitExitFullscreen","evaluate","createNSResolver","createExpression","getSelection","queryCommandValue","queryCommandSupported","queryCommandState","queryCommandIndeterm","queryCommandEnabled","execCommand","hasFocus","writeln","write","close","open","getElementsByName","createTreeWalker","createNodeIterator","createRange","createEvent","createAttributeNS","createAttribute","onmouseleave","onmousemove","onmouseout","onmouseover","onmouseup","onmousewheel","onpause","onplay","onplaying","onprogress","onratechange","onrejectionhandled","onreset","onresize","onscroll","onseeked","onseeking","onselect","onstalled","onsubmit","onsuspend","ontimeupdate","ontoggle","onunhandledrejection","onvolumechange","onwaiting","ontransitionend","ontransitionrun","ontransitionstart","ontransitioncancel","onanimationend","onanimationiteration","onanimationstart","onanimationcancel","onsearch","onwheel","rootElement","getElementsByTagName","getElementsByTagNameNS","getElementsByClassName","createElement","createElementNS","createDocumentFragment","createTextNode","createCDATASection","createComment","createProcessingInstruction","importNode","adoptNode","prototype","Symbol.species","next","Symbol.toStringTag","throw","return","registry","arguments","caller","Symbol.hasInstance","bind","toString","apply","call","__defineSetter__","__defineGetter__","isPrototypeOf","propertyIsEnumerable","hasOwnProperty","valueOf","toLocaleString","__lookupGetter__","__lookupSetter__","__proto__","message","Symbol.iterator","values","forEach","concat","fill","join","pop","lastIndexOf","PrivateSymbol.values","PrivateSymbol.keys","PrivateSymbol.forEach","PrivateSymbol.entries","copyWithin","includes","findIndex","find","keys","entries","map","push","reduceRight","PrivateSymbol.push","reverse","reduce","shift","flatMap","flat","filter","PrivateSymbol.shift","indexOf","some","slice","every","unshift","splice","sort","Symbol.asyncIterator","formatToParts","byteLength","Symbol.search","dotAll","compile","exec","test","Symbol.split","Symbol.replace","Symbol.match","flags","source","unicode","sticky","multiline","ignoreCase","global","Symbol.toPrimitive","localeCompare","trimEnd","charAt","charCodeAt","codePointAt","PrivateSymbol.replaceUsingRegExp","PrivateSymbol.replaceUsingStringSearch","substr","substring","toLowerCase","toUpperCase","toLocaleLowerCase","toLocaleUpperCase","trim","startsWith","endsWith","normalize","PrivateSymbol.charCodeAt","trimStart","trimLeft","trimRight","has","size","PrivateSymbol.set","PrivateSymbol.get","set","delete","get","add","PrivateSymbol.has","PrivateSymbol.add","PrivateSymbol.then","hasChildNodes","cloneNode","isEqualNode","isSameNode","compareDocumentPosition","contains","lookupPrefix","lookupNamespaceURI","isDefaultNamespace","insertBefore","nodeValue","nextSibling","replaceChild","removeChild","previousSibling","lastChild","firstChild","childNodes","parentElement","parentNode","appendChild","ownerDocument","isConnected","baseURI","nodeName","nodeType","getRootNode","textContent","PrivateSymbol.getPrototypeOf","PrivateSymbol.defineProperty","PrivateSymbol.create","isArray","isView","PrivateSymbol.isView","CompileError","Instance","LinkError","Memory","Module","RuntimeError","Table","PrivateSymbol.ownKeys","PrivateSymbol.getOwnPropertyDescriptor","Collator","NumberFormat","DateTimeFormat","PluralRules","getCanonicalLocales","PrivateSymbol.resolve","PrivateSymbol.reject","isInteger","asyncIterator","isConcatSpreadable","hasInstance","iterator","match","replace","search","species","split","toStringTag","unscopables","toPrimitive"],"roots":[328,442,0,2397,443,0,327,442,0,326,442,0,325,442,0,324,442,0,323,442,0,322,442,0,2396,443,0,321,442,0,320,442,0,319,442,0,318,442,0,56,443,0,317,442,0,316,442,0,315,442,0,55,443,0,314,442,0,313,442,0,312,442,0,54,443,0,311,442,0,310,442,0,309,442,0,53,443,0,308,442,0,54,443,0,307,442,0,306,442,0,55,443,0,305,442,0,304,442,0,52,443,0,303,442,0,51,443,0,50,443,0,49,443,0,48,443,0,302,442,0,47,443,0,301,442,0,46,443,0,300,442,0,45,443,0,299,442,0,44,443,0,298,442,0,43,443,0,297,442,0,42,443,0,296,442,0,41,443,0,295,442,0,40,443,0,294,442,0,39,443,0,38,443,0,293,442,0,37,443,0,292,442,0,36,443,0,291,442,0,35,443,0,290,442,0,34,443,0,289,442,0,33,443,0,288,442,0,32,443,0,285,442,0,31,443,0,283,442,0,30,443,0,281,442,0,29,443,0,278,442,0,28,443,0,274,442,0,27,443,0,269,442,0,26,443,0,266,442,0,25,443,0,263,442,0,24,443,0,259,442,0,23,443,0,256,442,0,22,443,0,251,442,0,21,443,0,248,442,0,20,443,0,244,442,0,19,443,0,242,442,0,18,443,0,239,442,0,17,443,0,236,442,0,16,443,0,234,442,0,15,443,0,231,442,0,14,443,0,228,442,0,13,443,0,223,442,0,12,443,0,220,442,0,11,443,0,215,442,0,10,443,0,213,442,0,9,443,0,211,442,0,8,443,0,208,442,0,7,443,0,205,442,0,6,443,0,202,442,0,5,443,0,199,442,0,4,443,0,197,442,0,3,443,0,195,442,0,2,443,0,191,442,0,1,443,0,186,442,0,184,442,0,181,442,0,176,442,0,172,442,0,169,442,0,165,442,0,163,442,0,162,442,0,161,442,0,160,442,0,159,442,0,158,442,0,157,442,0,164,442,0,166,442,0,168,442,0,171,442,0,173,442,0,167,442,0,170,442,0,179,442,0,175,442,0,174,442,0,177,442,0,178,442,0,180,442,0,183,442,0,182,442,0,185,442,0,188,442,0,187,442,0,189,442,0,190,442,0,192,442,0,200,442,0,201,442,0,206,442,0,196,442,0,198,442,0,193,442,0,194,442,0,203,442,0,204,442,0,207,442,0,209,442,0,210,442,0,212,442,0,214,442,0,217,442,0,216,442,0,221,442,0,218,442,0,219,442,0,222,442,0,224,442,0,225,442,0,226,442,0,227,442,0,229,442,0,230,442,0,232,442,0,233,442,0,235,442,0,237,442,0,238,442,0,240,442,0,241,442,0,243,442,0,245,442,0,246,442,0,247,442,0,249,442,0,250,442,0,253,442,0,252,442,0,254,442,0,255,442,0,257,442,0,258,442,0,260,442,0,261,442,0,262,442,0,264,442,0,265,442,0,267,442,0,273,442,0,268,442,0,275,442,0,271,442,0,270,442,0,272,442,0,276,442,0,277,442,0,279,442,0,280,442,0,282,442,0,284,442,0,286,442,0,287,442,0,156,442,0,155,442,0,154,442,0,153,442,0,152,442,0,151,442,0,150,442,0,149,442,0,148,442,0,147,442,0,146,442,0,145,442,0,144,442,0,143,442,0,142,442,0,141,442,0,140,442,0,139,442,0,138,442,0,137,442,0,136,442,0,135,442,0,134,442,0,133,442,0,132,442,0,131,442,0,130,442,0,129,442,0,128,442,0,127,442,0,126,442,0,125,442,0,124,442,0,123,442,0,122,442,0,121,442,0,120,442,0,119,442,0,118,442,0,117,442,0,116,442,0,115,442,0,114,442,0,113,442,0,112,442,0,111,442,0,110,442,0,109,442,0,108,442,0,107,442,0,106,442,0,105,442,0,104,442,0,103,442,0,102,442,0,101,442,0,100,442,0,99,442,0,98,442,0,97,442,0,96,442,0,95,442,0,94,442,0,93,442,0,92,442,0,91,442,0,90,442,0,89,442,0,88,442,0,87,442,0,86,442,0,85,442,0,84,442,0,83,442,0,82,442,0,81,442,0,80,442,0,79,442,0,78,442,0,77,442,0,76,442,0,75,442,0,74,442,0,73,442,0,72,442,0,71,442,0,70,442,0,69,442,0,68,442,0,67,442,0,66,442,0,65,442,0,64,442,0,63,442,0,62,442,0,61,442,0,60,442,0,59,442,0,58,442,0,57,442,0,328,442,0,327,442,0,326,442,0,2397,443,0,325,442,0,2396,443,0,324,442,0,323,442,0,56,443,0,322,442,0,321,442,0,55,443,0,320,442,0,54,443,0,319,442,0,53,443,0,318,442,0,54,443,0,317,442,0,55,443,0,52,443,0,51,443,0,316,442,0,50,443,0,315,442,0,49,443,0,314,442,0,48,443,0,313,442,0,47,443,0,312,442,0,46,443,0,311,442,0,45,443,0,310,442,0,44,443,0,309,442,0,43,443,0,308,442,0,42,443,0,307,442,0,41,443,0,306,442,0,40,443,0,305,442,0,39,443,0,304,442,0,38,443,0,303,442,0,37,443,0,302,442,0,36,443,0,301,442,0,35,443,0,300,442,0,34,443,0,33,443,0,32,443,0,31,443,0,30,443,0,29,443,0,28,443,0,27,443,0,26,443,0,25,443,0,299,442,0,24,443,0,298,442,0,23,443,0,297,442,0,22,443,0,21,443,0,296,442,0,20,443,0,295,442,0,294,442,0,293,442,0,292,442,0,291,442,0,290,442,0,289,442,0,288,442,0,285,442,0,283,442,0,281,442,0,278,442,0,274,442,0,269,442,0,266,442,0,263,442,0,259,442,0,256,442,0,251,442,0,248,442,0,244,442,0,242,442,0,239,442,0,236,442,0,234,442,0,231,442,0,228,442,0,223,442,0,220,442,0,19,443,0,215,442,0,213,442,0,18,443,0,211,442,0,17,443,0,208,442,0,16,443,0,15,443,0,14,443,0,13,443,0,205,442,0,12,443,0,202,442,0,11,443,0,199,442,0,10,443,0,197,442,0,9,443,0,195,442,0,8,443,0,191,442,0,7,443,0,186,442,0,184,442,0,6,443,0,181,442,0,5,443,0,176,442,0,4,443,0,3,443,0,172,442,0,2,443,0,169,442,0,1,443,0,165,442,0,163,442,0,162,442,0,161,442,0,160,442,0,159,442,0,158,442,0,157,442,0,164,442,0,166,442,0,168,442,0,171,442,0,173,442,0,167,442,0,170,442,0,179,442,0,175,442,0,174,442,0,177,442,0,178,442,0,180,442,0,183,442,0,182,442,0,185,442,0,188,442,0,187,442,0,189,442,0,190,442,0,192,442,0,200,442,0,201,442,0,206,442,0,196,442,0,198,442,0,193,442,0,194,442,0,203,442,0,204,442,0,207,442,0,209,442,0,210,442,0,212,442,0,214,442,0,217,442,0,216,442,0,221,442,0,218,442,0,219,442,0,222,442,0,224,442,0,225,442,0,226,442,0,227,442,0,229,442,0,230,442,0,232,442,0,233,442,0,235,442,0,237,442,0,238,442,0,240,442,0,241,442,0,243,442,0,245,442,0,246,442,0,247,442,0,249,442,0,250,442,0,253,442,0,252,442,0,254,442,0,255,442,0,257,442,0,258,442,0,260,442,0,261,442,0,262,442,0,264,442,0,265,442,0,267,442,0,273,442,0,268,442,0,275,442,0,271,442,0,270,442,0,272,442,0,276,442,0,277,442,0,279,442,0,280,442,0,282,442,0,284,442,0,286,442,0,287,442,0,156,442,0,155,442,0,154,442,0,153,442,0,152,442,0,151,442,0,150,442,0,149,442,0,148,442,0,147,442,0,146,442,0,145,442,0,144,442,0,143,442,0,142,442,0,141,442,0,140,442,0,139,442,0,138,442,0,137,442,0,136,442,0,135,442,0,134,442,0,133,442,0,132,442,0,131,442,0,130,442,0,129,442,0,128,442,0,127,442,0,126,442,0,125,442,0,124,442,0,123,442,0,122,442,0,121,442,0,120,442,0,119,442,0,118,442,0,117,442,0,116,442,0,115,442,0,114,442,0,113,442,0,112,442,0,111,442,0,110,442,0,109,442,0,108,442,0,107,442,0,106,442,0,105,442,0,104,442,0,103,442,0,102,442,0,101,442,0,100,442,0,99,442,0,98,442,0,97,442,0,96,442,0,95,442,0,94,442,0,93,442,0,92,442,0,91,442,0,90,442,0,89,442,0,88,442,0,87,442,0,86,442,0,85,442,0,84,442,0,83,442,0,82,442,0,81,442,0,80,442,0,79,442,0,78,442,0,77,442,0,76,442,0,75,442,0,74,442,0,73,442,0,72,442,0,71,442,0,70,442,0,69,442,0,68,442,0,67,442,0,66,442,0,65,442,0,64,442,0,63,442,0,62,442,0,61,442,0,60,442,0,59,442,0,58,442,0,57,442,0],"labels":["","file:///Volumes/Data/Development/media/testcontent/simple/just-a-box.html","Object","Array","Arguments","JSLexicalEnvironment","Function","Structure","StructureRareData","TerminatedExecutionError","string","JSPropertyNameEnumerator","CustomGetterSetter","DOMAttributeGetterSetter","ScopedArgumentsTable","API Wrapper","NativeExecutable","EvalExecutable","ProgramExecutable","FunctionExecutable","WebAssemblyCodeBlock","ModuleProgramExecutable","RegExp","symbol","SymbolTable","JSFixedArray","Immutable Butterfly","JSSourceCode","JSScriptFetcher","JSScriptFetchParameters","StructureChain","SparseArrayValueMap","TemplateObjectDescriptor","ArrayBufferNeuteringWatchpoint","UnlinkedFunctionExecutable","UnlinkedProgramCodeBlock","UnlinkedEvalCodeBlock","UnlinkedFunctionCodeBlock","UnlinkedModuleProgramCodeBlock","PropertyTable","InferredType","InferredTypeTable","InferredValue","FunctionRareData","Exception","JSPromiseDeferred","JSInternalPromiseDeferred","ProgramCodeBlock","ModuleProgramCodeBlock","EvalCodeBlock","FunctionCodeBlock","HashMapBucket","Set Iterator","Map Iterator","JSBigInt","ExecutableToCodeBlockEdge","NativeStdFunctionCell","toLocaleLowerCase","localeCompare","toUpperCase","toLowerCase","substring","substr","slice","anonymous","lastIndexOf","indexOf","codePointAt","charCodeAt","charAt","valueOf","toString","[Symbol.asyncIterator]","[Symbol.iterator]","get byteLength","parseFloat","parseInt","test","[Symbol.split]","[Symbol.search]","[Symbol.replace]","[Symbol.match]","get flags","get source","get unicode","get sticky","get multiline","get ignoreCase","get dotAll","get global","exec","compile","copyWithin","includes","findIndex","find","keys","entries","map","reduceRight","reduce","flatMap","flat","filter","some","forEach","every","unshift","splice","sort","shift","reverse","push","pop","join","fill","concat","toLocaleString","values","get [Symbol.species]","set __proto__","get __proto__","__lookupSetter__","__lookupGetter__","__defineSetter__","__defineGetter__","isPrototypeOf","propertyIsEnumerable","hasOwnProperty","newPromiseCapability","[Symbol.hasInstance]","bind","call","apply","ModuleRecord","String Iterator","InternalPromise","InternalPromisePrototype","Promise","PromisePrototype","Set","Map","Error","Boolean","Number","Symbol","String","AsyncGenerator","Generator","AsyncIterator","Iterator","ArrayBuffer","ArrayBufferPrototype","ProxyRevoke","ProxyObject","ModuleNamespaceObject","JSAsyncGeneratorFunction","AsyncGeneratorFunction","AsyncFunction","GeneratorFunction","WebAssembly.Module","WebAssembly.Memory","WebAssembly.LinkError","WebAssembly.Instance","WebAssembly.CompileError","WebAssemblyToJSCallee","WebAssemblyWrapperFunction","WebAssemblyFunction","WebAssemblyModuleRecord","WebAssembly","InspectorInstrumentation","AsyncFromSyncIterator","Array Iterator","ModuleLoader","NodePrototype","JSWindowProxy","WindowProperties","EventTarget","EventTargetPrototype","ReadableStreamBYOBReaderPrivateConstructor","ReadableStreamDefaultReaderPrivateConstructor","ReadableStreamBYOBRequestPrivateConstructor","ReadableByteStreamControllerPrivateConstructor","ReadableStreamDefaultControllerPrivateConstructor","WindowPrototype","Window","WebAssembly.Table","WebAssembly.RuntimeError","HTMLDocument","HTMLDocumentPrototype","Document","DocumentPrototype","Node","GetterSetter","JSGlobalLexicalEnvironment","Callee","readableByteStreamControllerInvalidateBYOBRequest","readableByteStreamControllerShiftPendingDescriptor","readableByteStreamControllerFillDescriptorFromQueue","readableByteStreamControllerProcessPullDescriptors","readableByteStreamControllerRespondInClosedState","readableByteStreamControllerRespondInReadableState","readableByteStreamControllerRespondInternal","readableByteStreamControllerRespond","readableByteStreamControllerRespondWithNewView","readableByteStreamControllerEnqueueChunk","readableByteStreamControllerEnqueue","transferBufferToCurrentRealm","readableByteStreamControllerCallPullIfNeeded","readableByteStreamControllerShouldCallPull","readableByteStreamControllerPull","readableByteStreamControllerHandleQueueDrain","readableStreamHasDefaultReader","readableStreamHasBYOBReader","readableByteStreamControllerGetDesiredSize","readableByteStreamControllerClearPendingPullIntos","readableByteStreamControllerClose","readableByteStreamControllerError","readableByteStreamControllerCancel","isReadableStreamBYOBReader","isReadableStreamBYOBRequest","isReadableByteStreamController","privateInitializeReadableStreamBYOBRequest","privateInitializeReadableByteStreamController","privateInitializeReadableStreamBYOBReader","isRTCPeerConnection","callbacksAndDictionaryOverload","objectAndCallbacksOverload","enqueueOperation","next","throw","return","typedArraySpeciesConstructor","typedArrayClampArgumentToStartOrEnd","triggerPromiseReactions","toLength","toInteger","stringConcatSlowPath","speciesConstructor","setStateToMax","setIteratorNext","repeatSlowPath","repeatCharactersSlowPath","rejectPromise","regExpExec","promiseResolveThenableJob","promiseReactionJob","newRegistryEntry","newPromiseReaction","newHandledRejectedPromise","matchSlow","mapIteratorNext","isSuspendYieldState","isPromise","isNaN","isFinite","isExecutionState","isDictionary","initializePromise","hasObservableSideEffectsForStringReplace","hasObservableSideEffectsForRegExpSplit","hasObservableSideEffectsForRegExpMatch","getThenFinally","getDefaultCollator","getCatchFinally","generatorResume","fulfillPromise","flatIntoArrayWithCallback","flatIntoArray","doAsyncGeneratorBodyCall","createSetIterator","createResolvingFunctions","createMapIterator","createHTML","createAsyncFromSyncIterator","createArrayIterator","copyDataPropertiesNoExclusions","copyDataProperties","concatSlowPath","awaitValue","asyncGeneratorYield","asyncGeneratorResumeNext","asyncGeneratorResolve","asyncGeneratorReject","asyncGeneratorQueueIsEmpty","asyncGeneratorQueueEnqueue","asyncGeneratorQueueDequeue","asyncGeneratorEnqueue","asyncGeneratorDequeue","asyncFunctionResume","arraySpeciesCreate","arrayIteratorValueNext","arrayIteratorKeyValueNext","arrayIteratorKeyNext","advanceStringIndex","AsyncFromSyncIteratorConstructor","getCanonicalLocales","formatToParts","eval","reject","resolve","isInteger","isView","isArray","then","get size","has","delete","clear","add","set","get","[Symbol.toPrimitive]","trimEnd","trimStart","normalize","endsWith","startsWith","trim","toLocaleUpperCase","querySelectorAll","querySelector","append","prepend","getElementById","elementsFromPoint","elementFromPoint","releaseEvents","captureEvents","requestStorageAccess","hasStorageAccess","getCSSCanvasContext","caretRangeFromPoint","getOverrideStyle","exitPointerLock","webkitCancelFullScreen","webkitExitFullscreen","evaluate","createNSResolver","createExpression","getSelection","queryCommandValue","queryCommandSupported","queryCommandState","queryCommandIndeterm","queryCommandEnabled","execCommand","hasFocus","writeln","write","close","open","getElementsByName","createTreeWalker","createNodeIterator","createRange","createEvent","createAttributeNS","createAttribute","adoptNode","importNode","createProcessingInstruction","createComment","createCDATASection","createTextNode","createDocumentFragment","createElementNS","createElement","getElementsByClassName","getElementsByTagNameNS","getElementsByTagName","removeChild","replaceChild","appendChild","insertBefore","isDefaultNamespace","lookupNamespaceURI","lookupPrefix","contains","compareDocumentPosition","isSameNode","isEqualNode","cloneNode","hasChildNodes","getRootNode","dispatchEvent","removeEventListener","addEventListener","createImageBitmap","fetch","privateInitializeReadableStreamDefaultReader","privateInitializeReadableStreamDefaultController","mapLikeForEach","closeWritableStream","writableStreamAdvanceQueue","callOrScheduleWritableStreamAdvanceQueue","errorWritableStream","syncWritableStreamStateWithQueue","isWritableStream","peekQueueValue","enqueueValueWithSize","dequeueValue","newQueue","validateAndNormalizeQueuingStrategy","promiseInvokeOrFallbackOrNoop","promiseInvokeOrNoop","promiseInvokeOrNoopNoCatch","shieldingPromiseResolve","readableStreamDefaultControllerCanCloseOrEnqueue","readableStreamReaderGenericRelease","isReadableStreamDisturbed","readableStreamAddReadRequest","readableStreamDefaultReaderRead","readableStreamDefaultControllerEnqueue","readableStreamFulfillReadRequest","readableStreamClose","readableStreamDefaultControllerClose","readableStreamDefaultControllerPull","readableStreamDefaultControllerCancel","readableStreamCancel","readableStreamReaderGenericCancel","readableStreamDefaultControllerGetDesiredSize","isReadableStreamLocked","readableStreamDefaultControllerCallPullIfNeeded","readableStreamError","isReadableStreamDefaultController","isReadableStreamDefaultReader","isReadableStream","readableStreamTeeBranch2CancelFunction","readableStreamTeeBranch1CancelFunction","readableStreamTeePullFunction","doStructuredClone","readableStreamTee","readableStreamPipeTo","readableStreamDefaultControllerError","readableStreamReaderGenericInitialize","readableStreamAddReadIntoRequest","readableByteStreamControllerPullInto","readableStreamBYOBReaderRead","readableStreamFulfillReadIntoRequest","readableByteStreamControllerConvertDescriptor","readableByteStreamControllerCommitDescriptor","Strong references","Strong handles"]} >\ No newline at end of file
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 186416
:
342231
|
347981
|
347982