-
Notifications
You must be signed in to change notification settings - Fork 15
Setup C++ Infra in GiGL #558
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
116 commits
Select commit
Hold shift + click to select a range
87e2bfd
Add C++ infrastructure: build, format, lint, and unit test tooling
mkolodner-sc a18fb47
Remove pybind11 import from generate_compile_commands — bundled in to…
mkolodner-sc c127f2b
ppr seq
yliu2-sc b5b8027
Auto-build C++ extensions in post_install; auto-add LLVM to PATH on Mac
mkolodner-sc 9d3c8df
Rename setup.py to build_cpp_extensions.py; add build_cpp_extensions …
mkolodner-sc ace7126
Scope C++ extension discovery to gigl/cpp_extensions/
mkolodner-sc 48be4cc
Remove unnecessary existence check for build_cpp_extensions.py in pos…
mkolodner-sc 1b153b7
Review fixes + adopt PyTorch csrc conventions for C++ layout
mkolodner-sc 03ed8c4
Add multi-source C++ ext support, gigl/csrc package init, and .so git…
mkolodner-sc 638e667
Move build_cpp_extensions.py to scripts/ and wire into relevant make …
mkolodner-sc 416f6b4
Initial commit
mkolodner-sc 4af704e
merge main
mkolodner-sc 91d99d3
Update
mkolodner-sc 3d41dc3
Update
mkolodner-sc 04cee0c
Fix for gs mode
mkolodner-sc 99fdef2
Address comment
mkolodner-sc 04df860
Merge branch 'mkolodner-sc/fix_ppr_memory' into mkolodner-sc/cpp-infr…
mkolodner-sc 210c1dd
Upate
mkolodner-sc 909faf4
Merge branch 'main' into mkolodner-sc/cpp-infrastructure
mkolodner-sc 628a9f2
Update tidy and format
mkolodner-sc 75863a6
Update
mkolodner-sc cffa7ba
Update guidance
mkolodner-sc 49e9497
Update
mkolodner-sc 3e1bf6b
Fix
mkolodner-sc 7fd3ed9
Fix
mkolodner-sc a682ded
Update
mkolodner-sc 83e51bc
Update
mkolodner-sc 5e55f54
Updaate
mkolodner-sc 7b742f2
Add C++ linting infrastructure with clangd
mkolodner-sc 43c4271
Update
mkolodner-sc d0859a3
Update
mkolodner-sc d07ca57
Update
mkolodner-sc 4815fae
Update
mkolodner-sc 912e5db
Update
mkolodner-sc 5064788
Address comments
mkolodner-sc 099dd2a
Restore
mkolodner-sc 830da8b
Update
mkolodner-sc 3afb8a2
Update
mkolodner-sc b37786c
Update
mkolodner-sc ab51157
Update
mkolodner-sc df98b20
Fix
mkolodner-sc 1165fd3
Fixes
mkolodner-sc 4b579aa
Update
mkolodner-sc f4b015e
Update uv lock
mkolodner-sc 01a9b2c
Merge
mkolodner-sc 0f253d2
Update
mkolodner-sc 18a7316
Fix
mkolodner-sc b56945e
Bump pyproject version
mkolodner-sc 30e4e30
bump back to 0.2.0
mkolodner-sc cbf07f3
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] 870e936
Add cpp test to gh comment
mkolodner-sc 77e1a02
Update dockerfile with readme
mkolodner-sc ce9f1e2
update style guide
mkolodner-sc 61f4965
Small update
mkolodner-sc 3af2a33
remove mypy change
mkolodner-sc f417365
Make necessary changes for when we need to introduce cuda cpp operations
mkolodner-sc 83bb8a6
Additional fixes to cuda setup
mkolodner-sc 712d1e2
Add additional cuda fixes
mkolodner-sc 2861b8d
remove no build isolation from calls, update pyproject to not build i…
mkolodner-sc adf7046
remove additional build isolations
mkolodner-sc 549702b
Update release
mkolodner-sc ba300c3
Address additional cpp comments
mkolodner-sc fc68f9d
cleanup
mkolodner-sc fa1ee91
Updates
mkolodner-sc bb87166
Update
mkolodner-sc 907fc12
continued updates
mkolodner-sc d079113
Updates
mkolodner-sc a49a4c5
Simplify requirements
mkolodner-sc 3738af6
Update uv
mkolodner-sc 00d836f
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] 295138a
Update
mkolodner-sc e070854
Address comments
mkolodner-sc 5484c42
Update
mkolodner-sc cf8a35b
Potential fix
mkolodner-sc 928d5c7
Update
mkolodner-sc d4b7da3
Update to gigl-core
mkolodner-sc 1b774cc
update uv lock
mkolodner-sc 50dc620
Update uv
mkolodner-sc 1ea0a29
remove stale changes
mkolodner-sc d1dd8e3
remove stale files
mkolodner-sc b0abe98
Fix
mkolodner-sc e015cda
remove cpp references
mkolodner-sc b7782de
small fixes
mkolodner-sc 57c6df3
Update release
mkolodner-sc 65d1788
Update
mkolodner-sc 45cd03a
Update release todo and copy readme in dockerfiles
mkolodner-sc 308fd67
update builder dockerfile
mkolodner-sc c95a426
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] 50acb28
Format md
mkolodner-sc 64d2c20
fix dockerfile
mkolodner-sc 36d0dbb
update dataflow dockerfile
mkolodner-sc 2611c58
Update release to have cmake
mkolodner-sc e799806
Use explicit publish-url in release workflow instead of named index
mkolodner-sc 496abda
Remove unused index-name field from release matrix
mkolodner-sc ab3d60b
Clear stale cmake cache before gigl-core wheel build
mkolodner-sc 0bb3d34
remove c++ manual check
mkolodner-sc 495c19d
Comments
mkolodner-sc 2f0f753
Update
mkolodner-sc 294e4d2
update releasing guide
mkolodner-sc d4f0126
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] cb1ebb0
Update
mkolodner-sc 03a2175
Update
mkolodner-sc 525f8fc
Update
mkolodner-sc ed87989
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] 6bb8943
Address some comments
mkolodner-sc 8282bbc
Format
mkolodner-sc fcf320d
Merge branch 'mkolodner-sc/cpp-infrastructure' of github.com:Snapchat…
mkolodner-sc 8dbd4c4
Address comments
mkolodner-sc b598f3d
update uv lock
mkolodner-sc a482bed
[AUTOMATED] Update dep.vars, and other relevant files with new image …
github-actions[bot] f40e94e
Address comments
mkolodner-sc dba5580
Merge branch 'mkolodner-sc/cpp-infrastructure' of github.com:Snapchat…
mkolodner-sc 3e26b41
merge main
mkolodner-sc 6b031e1
update fix lint cpp
mkolodner-sc 6ffbead
fix
mkolodner-sc 6179f33
Fix
mkolodner-sc File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,88 @@ | ||
| --- | ||
| # BasedOnStyle: LLVM | ||
| AccessModifierOffset: -4 | ||
| AlignAfterOpenBracket: Align | ||
| AlignConsecutiveAssignments: false | ||
| AlignConsecutiveDeclarations: false | ||
| AlignEscapedNewlinesLeft: false | ||
| AlignOperands: true | ||
| AlignTrailingComments: true | ||
| AllowAllParametersOfDeclarationOnNextLine: true | ||
| AllowShortBlocksOnASingleLine: false | ||
| AllowShortCaseLabelsOnASingleLine: false | ||
| AllowShortFunctionsOnASingleLine: Empty | ||
| AllowShortIfStatementsOnASingleLine: false | ||
| AllowShortLoopsOnASingleLine: false | ||
| AlwaysBreakAfterReturnType: None | ||
| AlwaysBreakBeforeMultilineStrings: false | ||
| AlwaysBreakTemplateDeclarations: true | ||
| BinPackArguments: false | ||
| BinPackParameters: false | ||
| BreakAfterJavaFieldAnnotations: false | ||
| BreakBeforeBinaryOperators: None | ||
| BreakBeforeBraces: Attach | ||
| BreakBeforeTernaryOperators: false | ||
| BreakConstructorInitializersBeforeComma: false | ||
| BreakStringLiterals: true | ||
| ColumnLimit: 120 | ||
| CommentPragmas: '^ IWYU pragma:' | ||
| ConstructorInitializerAllOnOneLineOrOnePerLine: true | ||
| ConstructorInitializerIndentWidth: 4 | ||
| ContinuationIndentWidth: 4 | ||
| Cpp11BracedListStyle: true | ||
| DerivePointerAlignment: false | ||
| DisableFormat: false | ||
| FixNamespaceComments: true | ||
| ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] | ||
| # Lower Priority numbers sort first (Priority 1 appears before Priority 2, etc.). | ||
| # List order matches priority order (1 → 2 → 3); torch/pybind11 must be listed before the | ||
| # broader '^<' rule so it is matched first. | ||
| # Result: torch/pybind11 (1) → system/third-party (2) → project-local headers (3). | ||
| # Add graphlearn_torch to the Priority 1 regex when GLT headers appear in the codebase. | ||
| IncludeCategories: | ||
| - Regex: '^<(torch|pybind11)/' | ||
| Priority: 1 | ||
| - Regex: '^(<|"gtest/)' | ||
| Priority: 2 | ||
| - Regex: '.*' | ||
| Priority: 3 | ||
| IncludeIsMainRegex: '^$' | ||
| IndentCaseLabels: true | ||
| IndentWidth: 4 | ||
| IndentWrappedFunctionNames: false | ||
| KeepEmptyLinesAtTheStartOfBlocks: false | ||
| MacroBlockBegin: '' | ||
| MacroBlockEnd: '' | ||
| MaxEmptyLinesToKeep: 1 | ||
| NamespaceIndentation: None | ||
| ObjCBlockIndentWidth: 4 | ||
| ObjCSpaceAfterProperty: true | ||
| ObjCSpaceBeforeProtocolList: true | ||
| PenaltyBreakBeforeFirstCallParameter: 19 | ||
| PenaltyBreakComment: 300 | ||
| PenaltyBreakFirstLessLess: 120 | ||
| PenaltyBreakString: 1000 | ||
| PenaltyExcessCharacter: 1000000 | ||
| PenaltyReturnTypeOnItsOwnLine: 10000000 | ||
| PointerAlignment: Left | ||
| RawStringFormats: | ||
| - Delimiters: [pb] | ||
| Language: TextProto | ||
| BasedOnStyle: google | ||
| ReflowComments: true | ||
| SortIncludes: true | ||
| SpaceAfterCStyleCast: false | ||
| SpaceAfterTemplateKeyword: false | ||
| SpaceBeforeAssignmentOperators: true | ||
| SpaceBeforeParens: ControlStatements | ||
| SpaceInEmptyParentheses: false | ||
| SpacesBeforeTrailingComments: 1 | ||
| SpacesInAngles: false | ||
| SpacesInContainerLiterals: false | ||
| SpacesInCStyleCastParentheses: false | ||
| SpacesInParentheses: false | ||
| SpacesInSquareBrackets: false | ||
| Standard: c++17 | ||
| TabWidth: 4 | ||
| UseTab: Never | ||
| ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,236 @@ | ||
| --- | ||
| # -bugprone-implicit-widening-of-multiplication-result is disabled because it | ||
| # crashes clang-tidy 15 on a construct in ATen/core/dynamic_type.h (upstream | ||
| # LLVM bug). Re-enable when upgrading past clang-tidy 15. | ||
| # All other disabled checks are documented in docs/cpp_style_guide.md. | ||
| Checks: > | ||
| boost-use-to-string, | ||
| bugprone-*, | ||
| -bugprone-easily-swappable-parameters, | ||
| -bugprone-implicit-widening-of-multiplication-result, | ||
| -bugprone-narrowing-conversions, | ||
| cert-err34-c, | ||
| cert-flp30-c, | ||
| cert-msc32-c, | ||
| cert-msc50-cpp, | ||
| cert-msc51-cpp, | ||
| clang-diagnostic-*, | ||
| cppcoreguidelines-interfaces-global-init, | ||
| cppcoreguidelines-no-malloc, | ||
| cppcoreguidelines-pro-type-static-cast-downcast, | ||
| cppcoreguidelines-pro-type-union-access, | ||
| cppcoreguidelines-slicing, | ||
| google-build-namespaces, | ||
| google-explicit-constructor, | ||
| google-global-names-in-headers, | ||
| google-readability-casting, | ||
| google-runtime-member-string-references, | ||
| google-runtime-memset, | ||
| hicpp-exception-baseclass, | ||
| misc-*, | ||
| -misc-confusable-identifiers, | ||
| -misc-const-correctness, | ||
| -misc-no-recursion, | ||
| modernize-*, | ||
| -modernize-avoid-c-arrays, | ||
| -modernize-use-trailing-return-type, | ||
| performance-*, | ||
| readability-*, | ||
| -readability-avoid-const-params-in-decls, | ||
| -readability-function-cognitive-complexity, | ||
| -readability-container-contains, | ||
| -readability-identifier-length, | ||
| -readability-magic-numbers, | ||
|
|
||
| # WarningsAsErrors and HeaderFilterRegex work together: | ||
| # HeaderFilterRegex scopes which headers clang-tidy reports diagnostics for. | ||
| # Warnings from headers outside the regex (PyTorch, pybind11, etc.) are suppressed | ||
| # entirely and never reach WarningsAsErrors — so the large warning counts printed | ||
| # by clang-tidy ("N warnings generated") are third-party noise that is silently | ||
| # dropped. Only diagnostics in our own headers (.*/gigl/csrc/.*) are reported, | ||
| # and those are treated as hard errors. | ||
| WarningsAsErrors: '*' | ||
| HeaderFilterRegex: '.*/gigl-core/csrc/.*' | ||
| FormatStyle: none | ||
| # CheckOptions: per-check tuning parameters. Each entry configures a specific | ||
| # option for an individual check, using the form: | ||
| # key: <check-name>.<OptionName> | ||
| # value: <value> | ||
| # These let you adjust thresholds, naming patterns, and behavior without | ||
| # enabling or disabling the check entirely. | ||
| CheckOptions: | ||
| - key: bugprone-argument-comment.StrictMode | ||
| value: '0' | ||
| - key: bugprone-assert-side-effect.AssertMacros | ||
| value: 'assert,SC_ASSERT' | ||
| - key: bugprone-assert-side-effect.CheckFunctionCalls | ||
| value: '0' | ||
| - key: bugprone-dangling-handle.HandleClasses | ||
| value: 'std::basic_string_view;std::experimental::basic_string_view' | ||
| - key: bugprone-string-constructor.LargeLengthThreshold | ||
| value: '8388608' | ||
| - key: bugprone-string-constructor.WarnOnLargeLength | ||
| value: '1' | ||
| - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays | ||
| value: '1' | ||
| - key: google-global-names-in-headers.HeaderFileExtensions | ||
| value: ',h,hh,hpp,hxx' | ||
| - key: google-readability-function-size.StatementThreshold | ||
| value: '800' | ||
| - key: google-readability-namespace-comments.ShortNamespaceLines | ||
| value: '10' | ||
| - key: google-readability-namespace-comments.SpacesBeforeComments | ||
| value: '2' | ||
| - key: misc-definitions-in-headers.HeaderFileExtensions | ||
| value: ',h,hh,hpp,hxx' | ||
| - key: misc-definitions-in-headers.UseHeaderFileExtension | ||
| value: '1' | ||
| - key: misc-misplaced-widening-cast.CheckImplicitCasts | ||
| value: '0' | ||
| - key: misc-sizeof-expression.WarnOnSizeOfCompareToConstant | ||
| value: '1' | ||
| - key: misc-sizeof-expression.WarnOnSizeOfConstant | ||
| value: '1' | ||
| - key: misc-sizeof-expression.WarnOnSizeOfThis | ||
| value: '1' | ||
| - key: misc-suspicious-enum-usage.StrictMode | ||
| value: '0' | ||
| - key: misc-suspicious-missing-comma.MaxConcatenatedTokens | ||
| value: '5' | ||
| - key: misc-suspicious-missing-comma.RatioThreshold | ||
| value: '0.200000' | ||
| - key: misc-suspicious-missing-comma.SizeThreshold | ||
| value: '5' | ||
| - key: misc-suspicious-string-compare.StringCompareLikeFunctions | ||
| value: '' | ||
| - key: misc-suspicious-string-compare.WarnOnImplicitComparison | ||
| value: '1' | ||
| - key: misc-suspicious-string-compare.WarnOnLogicalNotComparison | ||
| value: '0' | ||
| - key: misc-throw-by-value-catch-by-reference.CheckThrowTemporaries | ||
| value: '1' | ||
| - key: modernize-loop-convert.MaxCopySize | ||
| value: '16' | ||
| - key: modernize-loop-convert.MinConfidence | ||
| value: reasonable | ||
| - key: modernize-loop-convert.NamingStyle | ||
| value: camelBack | ||
| - key: modernize-loop-convert.UseCxx20ReverseRanges | ||
| value: '0' | ||
| - key: modernize-make-unique.IgnoreMacros | ||
| value: '1' | ||
| - key: modernize-make-unique.IncludeStyle | ||
| value: 'llvm' | ||
| - key: modernize-make-unique.MakeSmartPtrFunction | ||
| value: 'std::make_unique' | ||
| - key: modernize-make-unique.MakeSmartPtrFunctionHeader | ||
| value: memory | ||
| - key: modernize-pass-by-value.IncludeStyle | ||
| value: llvm | ||
| - key: modernize-replace-auto-ptr.IncludeStyle | ||
| value: llvm | ||
| - key: modernize-use-emplace.ContainersWithPushBack | ||
| value: '::std::vector;::std::list;::std::deque' | ||
| - key: modernize-use-emplace.SmartPointers | ||
| value: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr' | ||
| - key: modernize-use-emplace.TupleMakeFunctions | ||
| value: '::std::make_pair;::std::make_tuple' | ||
| - key: modernize-use-emplace.TupleTypes | ||
| value: '::std::pair;::std::tuple' | ||
| - key: modernize-use-noexcept.ReplacementString | ||
| value: '' | ||
| - key: modernize-use-noexcept.UseNoexceptFalse | ||
| value: '1' | ||
| - key: modernize-use-nullptr.NullMacros | ||
| value: 'NULL' | ||
| - key: modernize-use-transparent-functors.SafeMode | ||
| value: '0' | ||
| - key: performance-faster-string-find.StringLikeClasses | ||
| value: 'std::basic_string' | ||
| - key: performance-for-range-copy.WarnOnAllAutoCopies | ||
| value: '0' | ||
| - key: performance-inefficient-string-concatenation.StrictMode | ||
| value: '0' | ||
| - key: performance-inefficient-vector-operation.VectorLikeClasses | ||
| value: '::std::vector' | ||
| - key: performance-move-const-arg.CheckTriviallyCopyableMove | ||
| value: '1' | ||
| - key: performance-move-constructor-init.IncludeStyle | ||
| value: llvm | ||
| - key: performance-type-promotion-in-math-fn.IncludeStyle | ||
| value: llvm | ||
| - key: readability-braces-around-statements.ShortStatementLines | ||
| value: '0' | ||
| # BranchThreshold, NestingThreshold, and ParameterThreshold are set to UINT32_MAX | ||
| # to effectively disable these sub-checks. GNN/ML kernels legitimately have deep | ||
| # nesting (loops over nodes, edges, and features) and many parameters (model configs, | ||
| # hyperparameters), so enforcing these limits would generate noise on valid code. | ||
| - key: readability-function-size.BranchThreshold | ||
| value: '4294967295' | ||
| - key: readability-function-size.LineThreshold | ||
| value: '1000' | ||
| - key: readability-function-size.NestingThreshold | ||
| value: '4294967295' | ||
| - key: readability-function-size.ParameterThreshold | ||
| value: '4294967295' | ||
| - key: readability-function-size.StatementThreshold | ||
| value: '800' | ||
| - key: readability-identifier-naming.ClassCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.ClassConstantPrefix | ||
| value: k | ||
| - key: readability-identifier-naming.ClassConstantCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.ClassMemberCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.ConstexprVariableCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.ConstexprVariablePrefix | ||
| value: k | ||
| - key: readability-identifier-naming.EnumCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.EnumConstantCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.FunctionCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.GlobalConstantPrefix | ||
| value: k | ||
| - key: readability-identifier-naming.GlobalConstantCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.IgnoreFailedSplit | ||
| value: '0' | ||
| - key: readability-identifier-naming.LocalConstantCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.MemberCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.MethodCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.ParameterCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.PrivateMemberCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.PrivateMemberPrefix | ||
| value: _ | ||
| - key: readability-identifier-naming.ProtectedMemberCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.ProtectedMemberPrefix | ||
| value: _ | ||
| - key: readability-identifier-naming.PublicMemberCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.TemplateParameterCase | ||
| value: camelBack | ||
| - key: readability-identifier-naming.TypeTemplateParameterCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.UnionCase | ||
| value: CamelCase | ||
| - key: readability-identifier-naming.VariableCase | ||
| value: camelBack | ||
| - key: readability-implicit-bool-conversion.AllowPointerConditions | ||
| value: '1' | ||
| - key: readability-simplify-boolean-expr.ChainedConditionalAssignment | ||
| value: '0' | ||
| - key: readability-simplify-boolean-expr.ChainedConditionalReturn | ||
| value: '0' | ||
| - key: readability-static-accessed-through-instance.NameSpecifierNestingThreshold | ||
| value: '3' | ||
| ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| CompileFlags: | ||
| CompilationDatabase: gigl-core/.cache/cmake_build |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.